// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
(function(global, factory) { /* global define, require, module */

    /* AMD */ if (typeof define === 'function' && define.amd)
        define(["protobufjs/minimal"], factory);

    /* CommonJS */ else if (typeof require === 'function' && typeof module === 'object' && module && module.exports)
        module.exports = factory(require("google-gax/build/src/protobuf").protobufMinimal);

})(this, function($protobuf) {
    "use strict";

    // Common aliases
    var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;
    
    // Exported root namespace
    var $root = $protobuf.roots._google_cloud_spanner_protos || ($protobuf.roots._google_cloud_spanner_protos = {});
    
    $root.google = (function() {
    
        /**
         * Namespace google.
         * @exports google
         * @namespace
         */
        var google = {};
    
        google.protobuf = (function() {
    
            /**
             * Namespace protobuf.
             * @memberof google
             * @namespace
             */
            var protobuf = {};
    
            protobuf.Duration = (function() {
    
                /**
                 * Properties of a Duration.
                 * @memberof google.protobuf
                 * @interface IDuration
                 * @property {number|Long|null} [seconds] Duration seconds
                 * @property {number|null} [nanos] Duration nanos
                 */
    
                /**
                 * Constructs a new Duration.
                 * @memberof google.protobuf
                 * @classdesc Represents a Duration.
                 * @implements IDuration
                 * @constructor
                 * @param {google.protobuf.IDuration=} [properties] Properties to set
                 */
                function Duration(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Duration seconds.
                 * @member {number|Long} seconds
                 * @memberof google.protobuf.Duration
                 * @instance
                 */
                Duration.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * Duration nanos.
                 * @member {number} nanos
                 * @memberof google.protobuf.Duration
                 * @instance
                 */
                Duration.prototype.nanos = 0;
    
                /**
                 * Creates a new Duration instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration=} [properties] Properties to set
                 * @returns {google.protobuf.Duration} Duration instance
                 */
                Duration.create = function create(properties) {
                    return new Duration(properties);
                };
    
                /**
                 * Encodes the specified Duration message. Does not implicitly {@link google.protobuf.Duration.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration} message Duration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Duration.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds);
                    if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos);
                    return writer;
                };
    
                /**
                 * Encodes the specified Duration message, length delimited. Does not implicitly {@link google.protobuf.Duration.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration} message Duration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Duration.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Duration message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Duration} Duration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Duration.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Duration();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.seconds = reader.int64();
                                break;
                            }
                        case 2: {
                                message.nanos = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Duration message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Duration} Duration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Duration.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Duration message.
                 * @function verify
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Duration.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high)))
                            return "seconds: integer|Long expected";
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        if (!$util.isInteger(message.nanos))
                            return "nanos: integer expected";
                    return null;
                };
    
                /**
                 * Creates a Duration message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Duration} Duration
                 */
                Duration.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Duration)
                        return object;
                    var message = new $root.google.protobuf.Duration();
                    if (object.seconds != null)
                        if ($util.Long)
                            (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false;
                        else if (typeof object.seconds === "string")
                            message.seconds = parseInt(object.seconds, 10);
                        else if (typeof object.seconds === "number")
                            message.seconds = object.seconds;
                        else if (typeof object.seconds === "object")
                            message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber();
                    if (object.nanos != null)
                        message.nanos = object.nanos | 0;
                    return message;
                };
    
                /**
                 * Creates a plain object from a Duration message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.Duration} message Duration
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Duration.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.seconds = options.longs === String ? "0" : 0;
                        object.nanos = 0;
                    }
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (typeof message.seconds === "number")
                            object.seconds = options.longs === String ? String(message.seconds) : message.seconds;
                        else
                            object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds;
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        object.nanos = message.nanos;
                    return object;
                };
    
                /**
                 * Converts this Duration to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Duration
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Duration.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Duration
                 * @function getTypeUrl
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Duration.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Duration";
                };
    
                return Duration;
            })();
    
            protobuf.FileDescriptorSet = (function() {
    
                /**
                 * Properties of a FileDescriptorSet.
                 * @memberof google.protobuf
                 * @interface IFileDescriptorSet
                 * @property {Array.<google.protobuf.IFileDescriptorProto>|null} [file] FileDescriptorSet file
                 */
    
                /**
                 * Constructs a new FileDescriptorSet.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileDescriptorSet.
                 * @implements IFileDescriptorSet
                 * @constructor
                 * @param {google.protobuf.IFileDescriptorSet=} [properties] Properties to set
                 */
                function FileDescriptorSet(properties) {
                    this.file = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileDescriptorSet file.
                 * @member {Array.<google.protobuf.IFileDescriptorProto>} file
                 * @memberof google.protobuf.FileDescriptorSet
                 * @instance
                 */
                FileDescriptorSet.prototype.file = $util.emptyArray;
    
                /**
                 * Creates a new FileDescriptorSet instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet=} [properties] Properties to set
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet instance
                 */
                FileDescriptorSet.create = function create(properties) {
                    return new FileDescriptorSet(properties);
                };
    
                /**
                 * Encodes the specified FileDescriptorSet message. Does not implicitly {@link google.protobuf.FileDescriptorSet.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet} message FileDescriptorSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorSet.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.file != null && message.file.length)
                        for (var i = 0; i < message.file.length; ++i)
                            $root.google.protobuf.FileDescriptorProto.encode(message.file[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FileDescriptorSet message, length delimited. Does not implicitly {@link google.protobuf.FileDescriptorSet.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet} message FileDescriptorSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorSet.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileDescriptorSet message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorSet.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileDescriptorSet();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.file && message.file.length))
                                    message.file = [];
                                message.file.push($root.google.protobuf.FileDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileDescriptorSet message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorSet.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileDescriptorSet message.
                 * @function verify
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileDescriptorSet.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.file != null && message.hasOwnProperty("file")) {
                        if (!Array.isArray(message.file))
                            return "file: array expected";
                        for (var i = 0; i < message.file.length; ++i) {
                            var error = $root.google.protobuf.FileDescriptorProto.verify(message.file[i]);
                            if (error)
                                return "file." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a FileDescriptorSet message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 */
                FileDescriptorSet.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileDescriptorSet)
                        return object;
                    var message = new $root.google.protobuf.FileDescriptorSet();
                    if (object.file) {
                        if (!Array.isArray(object.file))
                            throw TypeError(".google.protobuf.FileDescriptorSet.file: array expected");
                        message.file = [];
                        for (var i = 0; i < object.file.length; ++i) {
                            if (typeof object.file[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorSet.file: object expected");
                            message.file[i] = $root.google.protobuf.FileDescriptorProto.fromObject(object.file[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileDescriptorSet message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.FileDescriptorSet} message FileDescriptorSet
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileDescriptorSet.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.file = [];
                    if (message.file && message.file.length) {
                        object.file = [];
                        for (var j = 0; j < message.file.length; ++j)
                            object.file[j] = $root.google.protobuf.FileDescriptorProto.toObject(message.file[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this FileDescriptorSet to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileDescriptorSet
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileDescriptorSet.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FileDescriptorSet
                 * @function getTypeUrl
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FileDescriptorSet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FileDescriptorSet";
                };
    
                return FileDescriptorSet;
            })();
    
            /**
             * Edition enum.
             * @name google.protobuf.Edition
             * @enum {number}
             * @property {number} EDITION_UNKNOWN=0 EDITION_UNKNOWN value
             * @property {number} EDITION_LEGACY=900 EDITION_LEGACY value
             * @property {number} EDITION_PROTO2=998 EDITION_PROTO2 value
             * @property {number} EDITION_PROTO3=999 EDITION_PROTO3 value
             * @property {number} EDITION_2023=1000 EDITION_2023 value
             * @property {number} EDITION_2024=1001 EDITION_2024 value
             * @property {number} EDITION_1_TEST_ONLY=1 EDITION_1_TEST_ONLY value
             * @property {number} EDITION_2_TEST_ONLY=2 EDITION_2_TEST_ONLY value
             * @property {number} EDITION_99997_TEST_ONLY=99997 EDITION_99997_TEST_ONLY value
             * @property {number} EDITION_99998_TEST_ONLY=99998 EDITION_99998_TEST_ONLY value
             * @property {number} EDITION_99999_TEST_ONLY=99999 EDITION_99999_TEST_ONLY value
             * @property {number} EDITION_MAX=2147483647 EDITION_MAX value
             */
            protobuf.Edition = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "EDITION_UNKNOWN"] = 0;
                values[valuesById[900] = "EDITION_LEGACY"] = 900;
                values[valuesById[998] = "EDITION_PROTO2"] = 998;
                values[valuesById[999] = "EDITION_PROTO3"] = 999;
                values[valuesById[1000] = "EDITION_2023"] = 1000;
                values[valuesById[1001] = "EDITION_2024"] = 1001;
                values[valuesById[1] = "EDITION_1_TEST_ONLY"] = 1;
                values[valuesById[2] = "EDITION_2_TEST_ONLY"] = 2;
                values[valuesById[99997] = "EDITION_99997_TEST_ONLY"] = 99997;
                values[valuesById[99998] = "EDITION_99998_TEST_ONLY"] = 99998;
                values[valuesById[99999] = "EDITION_99999_TEST_ONLY"] = 99999;
                values[valuesById[2147483647] = "EDITION_MAX"] = 2147483647;
                return values;
            })();
    
            protobuf.FileDescriptorProto = (function() {
    
                /**
                 * Properties of a FileDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IFileDescriptorProto
                 * @property {string|null} [name] FileDescriptorProto name
                 * @property {string|null} ["package"] FileDescriptorProto package
                 * @property {Array.<string>|null} [dependency] FileDescriptorProto dependency
                 * @property {Array.<number>|null} [publicDependency] FileDescriptorProto publicDependency
                 * @property {Array.<number>|null} [weakDependency] FileDescriptorProto weakDependency
                 * @property {Array.<string>|null} [optionDependency] FileDescriptorProto optionDependency
                 * @property {Array.<google.protobuf.IDescriptorProto>|null} [messageType] FileDescriptorProto messageType
                 * @property {Array.<google.protobuf.IEnumDescriptorProto>|null} [enumType] FileDescriptorProto enumType
                 * @property {Array.<google.protobuf.IServiceDescriptorProto>|null} [service] FileDescriptorProto service
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [extension] FileDescriptorProto extension
                 * @property {google.protobuf.IFileOptions|null} [options] FileDescriptorProto options
                 * @property {google.protobuf.ISourceCodeInfo|null} [sourceCodeInfo] FileDescriptorProto sourceCodeInfo
                 * @property {string|null} [syntax] FileDescriptorProto syntax
                 * @property {google.protobuf.Edition|null} [edition] FileDescriptorProto edition
                 */
    
                /**
                 * Constructs a new FileDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileDescriptorProto.
                 * @implements IFileDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IFileDescriptorProto=} [properties] Properties to set
                 */
                function FileDescriptorProto(properties) {
                    this.dependency = [];
                    this.publicDependency = [];
                    this.weakDependency = [];
                    this.optionDependency = [];
                    this.messageType = [];
                    this.enumType = [];
                    this.service = [];
                    this.extension = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.name = "";
    
                /**
                 * FileDescriptorProto package.
                 * @member {string} package
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype["package"] = "";
    
                /**
                 * FileDescriptorProto dependency.
                 * @member {Array.<string>} dependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.dependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto publicDependency.
                 * @member {Array.<number>} publicDependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.publicDependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto weakDependency.
                 * @member {Array.<number>} weakDependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.weakDependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto optionDependency.
                 * @member {Array.<string>} optionDependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.optionDependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto messageType.
                 * @member {Array.<google.protobuf.IDescriptorProto>} messageType
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.messageType = $util.emptyArray;
    
                /**
                 * FileDescriptorProto enumType.
                 * @member {Array.<google.protobuf.IEnumDescriptorProto>} enumType
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.enumType = $util.emptyArray;
    
                /**
                 * FileDescriptorProto service.
                 * @member {Array.<google.protobuf.IServiceDescriptorProto>} service
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.service = $util.emptyArray;
    
                /**
                 * FileDescriptorProto extension.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} extension
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.extension = $util.emptyArray;
    
                /**
                 * FileDescriptorProto options.
                 * @member {google.protobuf.IFileOptions|null|undefined} options
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.options = null;
    
                /**
                 * FileDescriptorProto sourceCodeInfo.
                 * @member {google.protobuf.ISourceCodeInfo|null|undefined} sourceCodeInfo
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.sourceCodeInfo = null;
    
                /**
                 * FileDescriptorProto syntax.
                 * @member {string} syntax
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.syntax = "";
    
                /**
                 * FileDescriptorProto edition.
                 * @member {google.protobuf.Edition} edition
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.edition = 0;
    
                /**
                 * Creates a new FileDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto instance
                 */
                FileDescriptorProto.create = function create(properties) {
                    return new FileDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified FileDescriptorProto message. Does not implicitly {@link google.protobuf.FileDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto} message FileDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message["package"] != null && Object.hasOwnProperty.call(message, "package"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message["package"]);
                    if (message.dependency != null && message.dependency.length)
                        for (var i = 0; i < message.dependency.length; ++i)
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.dependency[i]);
                    if (message.messageType != null && message.messageType.length)
                        for (var i = 0; i < message.messageType.length; ++i)
                            $root.google.protobuf.DescriptorProto.encode(message.messageType[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.enumType != null && message.enumType.length)
                        for (var i = 0; i < message.enumType.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.encode(message.enumType[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.service != null && message.service.length)
                        for (var i = 0; i < message.service.length; ++i)
                            $root.google.protobuf.ServiceDescriptorProto.encode(message.service[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    if (message.extension != null && message.extension.length)
                        for (var i = 0; i < message.extension.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.extension[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.FileOptions.encode(message.options, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.sourceCodeInfo != null && Object.hasOwnProperty.call(message, "sourceCodeInfo"))
                        $root.google.protobuf.SourceCodeInfo.encode(message.sourceCodeInfo, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                    if (message.publicDependency != null && message.publicDependency.length)
                        for (var i = 0; i < message.publicDependency.length; ++i)
                            writer.uint32(/* id 10, wireType 0 =*/80).int32(message.publicDependency[i]);
                    if (message.weakDependency != null && message.weakDependency.length)
                        for (var i = 0; i < message.weakDependency.length; ++i)
                            writer.uint32(/* id 11, wireType 0 =*/88).int32(message.weakDependency[i]);
                    if (message.syntax != null && Object.hasOwnProperty.call(message, "syntax"))
                        writer.uint32(/* id 12, wireType 2 =*/98).string(message.syntax);
                    if (message.edition != null && Object.hasOwnProperty.call(message, "edition"))
                        writer.uint32(/* id 14, wireType 0 =*/112).int32(message.edition);
                    if (message.optionDependency != null && message.optionDependency.length)
                        for (var i = 0; i < message.optionDependency.length; ++i)
                            writer.uint32(/* id 15, wireType 2 =*/122).string(message.optionDependency[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified FileDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.FileDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto} message FileDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message["package"] = reader.string();
                                break;
                            }
                        case 3: {
                                if (!(message.dependency && message.dependency.length))
                                    message.dependency = [];
                                message.dependency.push(reader.string());
                                break;
                            }
                        case 10: {
                                if (!(message.publicDependency && message.publicDependency.length))
                                    message.publicDependency = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.publicDependency.push(reader.int32());
                                } else
                                    message.publicDependency.push(reader.int32());
                                break;
                            }
                        case 11: {
                                if (!(message.weakDependency && message.weakDependency.length))
                                    message.weakDependency = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.weakDependency.push(reader.int32());
                                } else
                                    message.weakDependency.push(reader.int32());
                                break;
                            }
                        case 15: {
                                if (!(message.optionDependency && message.optionDependency.length))
                                    message.optionDependency = [];
                                message.optionDependency.push(reader.string());
                                break;
                            }
                        case 4: {
                                if (!(message.messageType && message.messageType.length))
                                    message.messageType = [];
                                message.messageType.push($root.google.protobuf.DescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 5: {
                                if (!(message.enumType && message.enumType.length))
                                    message.enumType = [];
                                message.enumType.push($root.google.protobuf.EnumDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 6: {
                                if (!(message.service && message.service.length))
                                    message.service = [];
                                message.service.push($root.google.protobuf.ServiceDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 7: {
                                if (!(message.extension && message.extension.length))
                                    message.extension = [];
                                message.extension.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 8: {
                                message.options = $root.google.protobuf.FileOptions.decode(reader, reader.uint32());
                                break;
                            }
                        case 9: {
                                message.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.decode(reader, reader.uint32());
                                break;
                            }
                        case 12: {
                                message.syntax = reader.string();
                                break;
                            }
                        case 14: {
                                message.edition = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message["package"] != null && message.hasOwnProperty("package"))
                        if (!$util.isString(message["package"]))
                            return "package: string expected";
                    if (message.dependency != null && message.hasOwnProperty("dependency")) {
                        if (!Array.isArray(message.dependency))
                            return "dependency: array expected";
                        for (var i = 0; i < message.dependency.length; ++i)
                            if (!$util.isString(message.dependency[i]))
                                return "dependency: string[] expected";
                    }
                    if (message.publicDependency != null && message.hasOwnProperty("publicDependency")) {
                        if (!Array.isArray(message.publicDependency))
                            return "publicDependency: array expected";
                        for (var i = 0; i < message.publicDependency.length; ++i)
                            if (!$util.isInteger(message.publicDependency[i]))
                                return "publicDependency: integer[] expected";
                    }
                    if (message.weakDependency != null && message.hasOwnProperty("weakDependency")) {
                        if (!Array.isArray(message.weakDependency))
                            return "weakDependency: array expected";
                        for (var i = 0; i < message.weakDependency.length; ++i)
                            if (!$util.isInteger(message.weakDependency[i]))
                                return "weakDependency: integer[] expected";
                    }
                    if (message.optionDependency != null && message.hasOwnProperty("optionDependency")) {
                        if (!Array.isArray(message.optionDependency))
                            return "optionDependency: array expected";
                        for (var i = 0; i < message.optionDependency.length; ++i)
                            if (!$util.isString(message.optionDependency[i]))
                                return "optionDependency: string[] expected";
                    }
                    if (message.messageType != null && message.hasOwnProperty("messageType")) {
                        if (!Array.isArray(message.messageType))
                            return "messageType: array expected";
                        for (var i = 0; i < message.messageType.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.verify(message.messageType[i]);
                            if (error)
                                return "messageType." + error;
                        }
                    }
                    if (message.enumType != null && message.hasOwnProperty("enumType")) {
                        if (!Array.isArray(message.enumType))
                            return "enumType: array expected";
                        for (var i = 0; i < message.enumType.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.verify(message.enumType[i]);
                            if (error)
                                return "enumType." + error;
                        }
                    }
                    if (message.service != null && message.hasOwnProperty("service")) {
                        if (!Array.isArray(message.service))
                            return "service: array expected";
                        for (var i = 0; i < message.service.length; ++i) {
                            var error = $root.google.protobuf.ServiceDescriptorProto.verify(message.service[i]);
                            if (error)
                                return "service." + error;
                        }
                    }
                    if (message.extension != null && message.hasOwnProperty("extension")) {
                        if (!Array.isArray(message.extension))
                            return "extension: array expected";
                        for (var i = 0; i < message.extension.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.extension[i]);
                            if (error)
                                return "extension." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.FileOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.sourceCodeInfo != null && message.hasOwnProperty("sourceCodeInfo")) {
                        var error = $root.google.protobuf.SourceCodeInfo.verify(message.sourceCodeInfo);
                        if (error)
                            return "sourceCodeInfo." + error;
                    }
                    if (message.syntax != null && message.hasOwnProperty("syntax"))
                        if (!$util.isString(message.syntax))
                            return "syntax: string expected";
                    if (message.edition != null && message.hasOwnProperty("edition"))
                        switch (message.edition) {
                        default:
                            return "edition: enum value expected";
                        case 0:
                        case 900:
                        case 998:
                        case 999:
                        case 1000:
                        case 1001:
                        case 1:
                        case 2:
                        case 99997:
                        case 99998:
                        case 99999:
                        case 2147483647:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates a FileDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 */
                FileDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.FileDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object["package"] != null)
                        message["package"] = String(object["package"]);
                    if (object.dependency) {
                        if (!Array.isArray(object.dependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.dependency: array expected");
                        message.dependency = [];
                        for (var i = 0; i < object.dependency.length; ++i)
                            message.dependency[i] = String(object.dependency[i]);
                    }
                    if (object.publicDependency) {
                        if (!Array.isArray(object.publicDependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.publicDependency: array expected");
                        message.publicDependency = [];
                        for (var i = 0; i < object.publicDependency.length; ++i)
                            message.publicDependency[i] = object.publicDependency[i] | 0;
                    }
                    if (object.weakDependency) {
                        if (!Array.isArray(object.weakDependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.weakDependency: array expected");
                        message.weakDependency = [];
                        for (var i = 0; i < object.weakDependency.length; ++i)
                            message.weakDependency[i] = object.weakDependency[i] | 0;
                    }
                    if (object.optionDependency) {
                        if (!Array.isArray(object.optionDependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.optionDependency: array expected");
                        message.optionDependency = [];
                        for (var i = 0; i < object.optionDependency.length; ++i)
                            message.optionDependency[i] = String(object.optionDependency[i]);
                    }
                    if (object.messageType) {
                        if (!Array.isArray(object.messageType))
                            throw TypeError(".google.protobuf.FileDescriptorProto.messageType: array expected");
                        message.messageType = [];
                        for (var i = 0; i < object.messageType.length; ++i) {
                            if (typeof object.messageType[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.messageType: object expected");
                            message.messageType[i] = $root.google.protobuf.DescriptorProto.fromObject(object.messageType[i]);
                        }
                    }
                    if (object.enumType) {
                        if (!Array.isArray(object.enumType))
                            throw TypeError(".google.protobuf.FileDescriptorProto.enumType: array expected");
                        message.enumType = [];
                        for (var i = 0; i < object.enumType.length; ++i) {
                            if (typeof object.enumType[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.enumType: object expected");
                            message.enumType[i] = $root.google.protobuf.EnumDescriptorProto.fromObject(object.enumType[i]);
                        }
                    }
                    if (object.service) {
                        if (!Array.isArray(object.service))
                            throw TypeError(".google.protobuf.FileDescriptorProto.service: array expected");
                        message.service = [];
                        for (var i = 0; i < object.service.length; ++i) {
                            if (typeof object.service[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.service: object expected");
                            message.service[i] = $root.google.protobuf.ServiceDescriptorProto.fromObject(object.service[i]);
                        }
                    }
                    if (object.extension) {
                        if (!Array.isArray(object.extension))
                            throw TypeError(".google.protobuf.FileDescriptorProto.extension: array expected");
                        message.extension = [];
                        for (var i = 0; i < object.extension.length; ++i) {
                            if (typeof object.extension[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.extension: object expected");
                            message.extension[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.extension[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.FileDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.FileOptions.fromObject(object.options);
                    }
                    if (object.sourceCodeInfo != null) {
                        if (typeof object.sourceCodeInfo !== "object")
                            throw TypeError(".google.protobuf.FileDescriptorProto.sourceCodeInfo: object expected");
                        message.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.fromObject(object.sourceCodeInfo);
                    }
                    if (object.syntax != null)
                        message.syntax = String(object.syntax);
                    switch (object.edition) {
                    default:
                        if (typeof object.edition === "number") {
                            message.edition = object.edition;
                            break;
                        }
                        break;
                    case "EDITION_UNKNOWN":
                    case 0:
                        message.edition = 0;
                        break;
                    case "EDITION_LEGACY":
                    case 900:
                        message.edition = 900;
                        break;
                    case "EDITION_PROTO2":
                    case 998:
                        message.edition = 998;
                        break;
                    case "EDITION_PROTO3":
                    case 999:
                        message.edition = 999;
                        break;
                    case "EDITION_2023":
                    case 1000:
                        message.edition = 1000;
                        break;
                    case "EDITION_2024":
                    case 1001:
                        message.edition = 1001;
                        break;
                    case "EDITION_1_TEST_ONLY":
                    case 1:
                        message.edition = 1;
                        break;
                    case "EDITION_2_TEST_ONLY":
                    case 2:
                        message.edition = 2;
                        break;
                    case "EDITION_99997_TEST_ONLY":
                    case 99997:
                        message.edition = 99997;
                        break;
                    case "EDITION_99998_TEST_ONLY":
                    case 99998:
                        message.edition = 99998;
                        break;
                    case "EDITION_99999_TEST_ONLY":
                    case 99999:
                        message.edition = 99999;
                        break;
                    case "EDITION_MAX":
                    case 2147483647:
                        message.edition = 2147483647;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.FileDescriptorProto} message FileDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.dependency = [];
                        object.messageType = [];
                        object.enumType = [];
                        object.service = [];
                        object.extension = [];
                        object.publicDependency = [];
                        object.weakDependency = [];
                        object.optionDependency = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object["package"] = "";
                        object.options = null;
                        object.sourceCodeInfo = null;
                        object.syntax = "";
                        object.edition = options.enums === String ? "EDITION_UNKNOWN" : 0;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message["package"] != null && message.hasOwnProperty("package"))
                        object["package"] = message["package"];
                    if (message.dependency && message.dependency.length) {
                        object.dependency = [];
                        for (var j = 0; j < message.dependency.length; ++j)
                            object.dependency[j] = message.dependency[j];
                    }
                    if (message.messageType && message.messageType.length) {
                        object.messageType = [];
                        for (var j = 0; j < message.messageType.length; ++j)
                            object.messageType[j] = $root.google.protobuf.DescriptorProto.toObject(message.messageType[j], options);
                    }
                    if (message.enumType && message.enumType.length) {
                        object.enumType = [];
                        for (var j = 0; j < message.enumType.length; ++j)
                            object.enumType[j] = $root.google.protobuf.EnumDescriptorProto.toObject(message.enumType[j], options);
                    }
                    if (message.service && message.service.length) {
                        object.service = [];
                        for (var j = 0; j < message.service.length; ++j)
                            object.service[j] = $root.google.protobuf.ServiceDescriptorProto.toObject(message.service[j], options);
                    }
                    if (message.extension && message.extension.length) {
                        object.extension = [];
                        for (var j = 0; j < message.extension.length; ++j)
                            object.extension[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.extension[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.FileOptions.toObject(message.options, options);
                    if (message.sourceCodeInfo != null && message.hasOwnProperty("sourceCodeInfo"))
                        object.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.toObject(message.sourceCodeInfo, options);
                    if (message.publicDependency && message.publicDependency.length) {
                        object.publicDependency = [];
                        for (var j = 0; j < message.publicDependency.length; ++j)
                            object.publicDependency[j] = message.publicDependency[j];
                    }
                    if (message.weakDependency && message.weakDependency.length) {
                        object.weakDependency = [];
                        for (var j = 0; j < message.weakDependency.length; ++j)
                            object.weakDependency[j] = message.weakDependency[j];
                    }
                    if (message.syntax != null && message.hasOwnProperty("syntax"))
                        object.syntax = message.syntax;
                    if (message.edition != null && message.hasOwnProperty("edition"))
                        object.edition = options.enums === String ? $root.google.protobuf.Edition[message.edition] === undefined ? message.edition : $root.google.protobuf.Edition[message.edition] : message.edition;
                    if (message.optionDependency && message.optionDependency.length) {
                        object.optionDependency = [];
                        for (var j = 0; j < message.optionDependency.length; ++j)
                            object.optionDependency[j] = message.optionDependency[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this FileDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FileDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FileDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FileDescriptorProto";
                };
    
                return FileDescriptorProto;
            })();
    
            protobuf.DescriptorProto = (function() {
    
                /**
                 * Properties of a DescriptorProto.
                 * @memberof google.protobuf
                 * @interface IDescriptorProto
                 * @property {string|null} [name] DescriptorProto name
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [field] DescriptorProto field
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [extension] DescriptorProto extension
                 * @property {Array.<google.protobuf.IDescriptorProto>|null} [nestedType] DescriptorProto nestedType
                 * @property {Array.<google.protobuf.IEnumDescriptorProto>|null} [enumType] DescriptorProto enumType
                 * @property {Array.<google.protobuf.DescriptorProto.IExtensionRange>|null} [extensionRange] DescriptorProto extensionRange
                 * @property {Array.<google.protobuf.IOneofDescriptorProto>|null} [oneofDecl] DescriptorProto oneofDecl
                 * @property {google.protobuf.IMessageOptions|null} [options] DescriptorProto options
                 * @property {Array.<google.protobuf.DescriptorProto.IReservedRange>|null} [reservedRange] DescriptorProto reservedRange
                 * @property {Array.<string>|null} [reservedName] DescriptorProto reservedName
                 * @property {google.protobuf.SymbolVisibility|null} [visibility] DescriptorProto visibility
                 */
    
                /**
                 * Constructs a new DescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a DescriptorProto.
                 * @implements IDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IDescriptorProto=} [properties] Properties to set
                 */
                function DescriptorProto(properties) {
                    this.field = [];
                    this.extension = [];
                    this.nestedType = [];
                    this.enumType = [];
                    this.extensionRange = [];
                    this.oneofDecl = [];
                    this.reservedRange = [];
                    this.reservedName = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.name = "";
    
                /**
                 * DescriptorProto field.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} field
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.field = $util.emptyArray;
    
                /**
                 * DescriptorProto extension.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} extension
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.extension = $util.emptyArray;
    
                /**
                 * DescriptorProto nestedType.
                 * @member {Array.<google.protobuf.IDescriptorProto>} nestedType
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.nestedType = $util.emptyArray;
    
                /**
                 * DescriptorProto enumType.
                 * @member {Array.<google.protobuf.IEnumDescriptorProto>} enumType
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.enumType = $util.emptyArray;
    
                /**
                 * DescriptorProto extensionRange.
                 * @member {Array.<google.protobuf.DescriptorProto.IExtensionRange>} extensionRange
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.extensionRange = $util.emptyArray;
    
                /**
                 * DescriptorProto oneofDecl.
                 * @member {Array.<google.protobuf.IOneofDescriptorProto>} oneofDecl
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.oneofDecl = $util.emptyArray;
    
                /**
                 * DescriptorProto options.
                 * @member {google.protobuf.IMessageOptions|null|undefined} options
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.options = null;
    
                /**
                 * DescriptorProto reservedRange.
                 * @member {Array.<google.protobuf.DescriptorProto.IReservedRange>} reservedRange
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.reservedRange = $util.emptyArray;
    
                /**
                 * DescriptorProto reservedName.
                 * @member {Array.<string>} reservedName
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.reservedName = $util.emptyArray;
    
                /**
                 * DescriptorProto visibility.
                 * @member {google.protobuf.SymbolVisibility} visibility
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.visibility = 0;
    
                /**
                 * Creates a new DescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto instance
                 */
                DescriptorProto.create = function create(properties) {
                    return new DescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified DescriptorProto message. Does not implicitly {@link google.protobuf.DescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto} message DescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.field != null && message.field.length)
                        for (var i = 0; i < message.field.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.field[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.nestedType != null && message.nestedType.length)
                        for (var i = 0; i < message.nestedType.length; ++i)
                            $root.google.protobuf.DescriptorProto.encode(message.nestedType[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    if (message.enumType != null && message.enumType.length)
                        for (var i = 0; i < message.enumType.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.encode(message.enumType[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.extensionRange != null && message.extensionRange.length)
                        for (var i = 0; i < message.extensionRange.length; ++i)
                            $root.google.protobuf.DescriptorProto.ExtensionRange.encode(message.extensionRange[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.extension != null && message.extension.length)
                        for (var i = 0; i < message.extension.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.extension[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.MessageOptions.encode(message.options, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                    if (message.oneofDecl != null && message.oneofDecl.length)
                        for (var i = 0; i < message.oneofDecl.length; ++i)
                            $root.google.protobuf.OneofDescriptorProto.encode(message.oneofDecl[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.reservedRange != null && message.reservedRange.length)
                        for (var i = 0; i < message.reservedRange.length; ++i)
                            $root.google.protobuf.DescriptorProto.ReservedRange.encode(message.reservedRange[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                    if (message.reservedName != null && message.reservedName.length)
                        for (var i = 0; i < message.reservedName.length; ++i)
                            writer.uint32(/* id 10, wireType 2 =*/82).string(message.reservedName[i]);
                    if (message.visibility != null && Object.hasOwnProperty.call(message, "visibility"))
                        writer.uint32(/* id 11, wireType 0 =*/88).int32(message.visibility);
                    return writer;
                };
    
                /**
                 * Encodes the specified DescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto} message DescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                if (!(message.field && message.field.length))
                                    message.field = [];
                                message.field.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 6: {
                                if (!(message.extension && message.extension.length))
                                    message.extension = [];
                                message.extension.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 3: {
                                if (!(message.nestedType && message.nestedType.length))
                                    message.nestedType = [];
                                message.nestedType.push($root.google.protobuf.DescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 4: {
                                if (!(message.enumType && message.enumType.length))
                                    message.enumType = [];
                                message.enumType.push($root.google.protobuf.EnumDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 5: {
                                if (!(message.extensionRange && message.extensionRange.length))
                                    message.extensionRange = [];
                                message.extensionRange.push($root.google.protobuf.DescriptorProto.ExtensionRange.decode(reader, reader.uint32()));
                                break;
                            }
                        case 8: {
                                if (!(message.oneofDecl && message.oneofDecl.length))
                                    message.oneofDecl = [];
                                message.oneofDecl.push($root.google.protobuf.OneofDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 7: {
                                message.options = $root.google.protobuf.MessageOptions.decode(reader, reader.uint32());
                                break;
                            }
                        case 9: {
                                if (!(message.reservedRange && message.reservedRange.length))
                                    message.reservedRange = [];
                                message.reservedRange.push($root.google.protobuf.DescriptorProto.ReservedRange.decode(reader, reader.uint32()));
                                break;
                            }
                        case 10: {
                                if (!(message.reservedName && message.reservedName.length))
                                    message.reservedName = [];
                                message.reservedName.push(reader.string());
                                break;
                            }
                        case 11: {
                                message.visibility = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.field != null && message.hasOwnProperty("field")) {
                        if (!Array.isArray(message.field))
                            return "field: array expected";
                        for (var i = 0; i < message.field.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.field[i]);
                            if (error)
                                return "field." + error;
                        }
                    }
                    if (message.extension != null && message.hasOwnProperty("extension")) {
                        if (!Array.isArray(message.extension))
                            return "extension: array expected";
                        for (var i = 0; i < message.extension.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.extension[i]);
                            if (error)
                                return "extension." + error;
                        }
                    }
                    if (message.nestedType != null && message.hasOwnProperty("nestedType")) {
                        if (!Array.isArray(message.nestedType))
                            return "nestedType: array expected";
                        for (var i = 0; i < message.nestedType.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.verify(message.nestedType[i]);
                            if (error)
                                return "nestedType." + error;
                        }
                    }
                    if (message.enumType != null && message.hasOwnProperty("enumType")) {
                        if (!Array.isArray(message.enumType))
                            return "enumType: array expected";
                        for (var i = 0; i < message.enumType.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.verify(message.enumType[i]);
                            if (error)
                                return "enumType." + error;
                        }
                    }
                    if (message.extensionRange != null && message.hasOwnProperty("extensionRange")) {
                        if (!Array.isArray(message.extensionRange))
                            return "extensionRange: array expected";
                        for (var i = 0; i < message.extensionRange.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.ExtensionRange.verify(message.extensionRange[i]);
                            if (error)
                                return "extensionRange." + error;
                        }
                    }
                    if (message.oneofDecl != null && message.hasOwnProperty("oneofDecl")) {
                        if (!Array.isArray(message.oneofDecl))
                            return "oneofDecl: array expected";
                        for (var i = 0; i < message.oneofDecl.length; ++i) {
                            var error = $root.google.protobuf.OneofDescriptorProto.verify(message.oneofDecl[i]);
                            if (error)
                                return "oneofDecl." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.MessageOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.reservedRange != null && message.hasOwnProperty("reservedRange")) {
                        if (!Array.isArray(message.reservedRange))
                            return "reservedRange: array expected";
                        for (var i = 0; i < message.reservedRange.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.ReservedRange.verify(message.reservedRange[i]);
                            if (error)
                                return "reservedRange." + error;
                        }
                    }
                    if (message.reservedName != null && message.hasOwnProperty("reservedName")) {
                        if (!Array.isArray(message.reservedName))
                            return "reservedName: array expected";
                        for (var i = 0; i < message.reservedName.length; ++i)
                            if (!$util.isString(message.reservedName[i]))
                                return "reservedName: string[] expected";
                    }
                    if (message.visibility != null && message.hasOwnProperty("visibility"))
                        switch (message.visibility) {
                        default:
                            return "visibility: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates a DescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 */
                DescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.DescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.DescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.field) {
                        if (!Array.isArray(object.field))
                            throw TypeError(".google.protobuf.DescriptorProto.field: array expected");
                        message.field = [];
                        for (var i = 0; i < object.field.length; ++i) {
                            if (typeof object.field[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.field: object expected");
                            message.field[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.field[i]);
                        }
                    }
                    if (object.extension) {
                        if (!Array.isArray(object.extension))
                            throw TypeError(".google.protobuf.DescriptorProto.extension: array expected");
                        message.extension = [];
                        for (var i = 0; i < object.extension.length; ++i) {
                            if (typeof object.extension[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.extension: object expected");
                            message.extension[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.extension[i]);
                        }
                    }
                    if (object.nestedType) {
                        if (!Array.isArray(object.nestedType))
                            throw TypeError(".google.protobuf.DescriptorProto.nestedType: array expected");
                        message.nestedType = [];
                        for (var i = 0; i < object.nestedType.length; ++i) {
                            if (typeof object.nestedType[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.nestedType: object expected");
                            message.nestedType[i] = $root.google.protobuf.DescriptorProto.fromObject(object.nestedType[i]);
                        }
                    }
                    if (object.enumType) {
                        if (!Array.isArray(object.enumType))
                            throw TypeError(".google.protobuf.DescriptorProto.enumType: array expected");
                        message.enumType = [];
                        for (var i = 0; i < object.enumType.length; ++i) {
                            if (typeof object.enumType[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.enumType: object expected");
                            message.enumType[i] = $root.google.protobuf.EnumDescriptorProto.fromObject(object.enumType[i]);
                        }
                    }
                    if (object.extensionRange) {
                        if (!Array.isArray(object.extensionRange))
                            throw TypeError(".google.protobuf.DescriptorProto.extensionRange: array expected");
                        message.extensionRange = [];
                        for (var i = 0; i < object.extensionRange.length; ++i) {
                            if (typeof object.extensionRange[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.extensionRange: object expected");
                            message.extensionRange[i] = $root.google.protobuf.DescriptorProto.ExtensionRange.fromObject(object.extensionRange[i]);
                        }
                    }
                    if (object.oneofDecl) {
                        if (!Array.isArray(object.oneofDecl))
                            throw TypeError(".google.protobuf.DescriptorProto.oneofDecl: array expected");
                        message.oneofDecl = [];
                        for (var i = 0; i < object.oneofDecl.length; ++i) {
                            if (typeof object.oneofDecl[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.oneofDecl: object expected");
                            message.oneofDecl[i] = $root.google.protobuf.OneofDescriptorProto.fromObject(object.oneofDecl[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.DescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.MessageOptions.fromObject(object.options);
                    }
                    if (object.reservedRange) {
                        if (!Array.isArray(object.reservedRange))
                            throw TypeError(".google.protobuf.DescriptorProto.reservedRange: array expected");
                        message.reservedRange = [];
                        for (var i = 0; i < object.reservedRange.length; ++i) {
                            if (typeof object.reservedRange[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.reservedRange: object expected");
                            message.reservedRange[i] = $root.google.protobuf.DescriptorProto.ReservedRange.fromObject(object.reservedRange[i]);
                        }
                    }
                    if (object.reservedName) {
                        if (!Array.isArray(object.reservedName))
                            throw TypeError(".google.protobuf.DescriptorProto.reservedName: array expected");
                        message.reservedName = [];
                        for (var i = 0; i < object.reservedName.length; ++i)
                            message.reservedName[i] = String(object.reservedName[i]);
                    }
                    switch (object.visibility) {
                    default:
                        if (typeof object.visibility === "number") {
                            message.visibility = object.visibility;
                            break;
                        }
                        break;
                    case "VISIBILITY_UNSET":
                    case 0:
                        message.visibility = 0;
                        break;
                    case "VISIBILITY_LOCAL":
                    case 1:
                        message.visibility = 1;
                        break;
                    case "VISIBILITY_EXPORT":
                    case 2:
                        message.visibility = 2;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a DescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.DescriptorProto} message DescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.field = [];
                        object.nestedType = [];
                        object.enumType = [];
                        object.extensionRange = [];
                        object.extension = [];
                        object.oneofDecl = [];
                        object.reservedRange = [];
                        object.reservedName = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                        object.visibility = options.enums === String ? "VISIBILITY_UNSET" : 0;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.field && message.field.length) {
                        object.field = [];
                        for (var j = 0; j < message.field.length; ++j)
                            object.field[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.field[j], options);
                    }
                    if (message.nestedType && message.nestedType.length) {
                        object.nestedType = [];
                        for (var j = 0; j < message.nestedType.length; ++j)
                            object.nestedType[j] = $root.google.protobuf.DescriptorProto.toObject(message.nestedType[j], options);
                    }
                    if (message.enumType && message.enumType.length) {
                        object.enumType = [];
                        for (var j = 0; j < message.enumType.length; ++j)
                            object.enumType[j] = $root.google.protobuf.EnumDescriptorProto.toObject(message.enumType[j], options);
                    }
                    if (message.extensionRange && message.extensionRange.length) {
                        object.extensionRange = [];
                        for (var j = 0; j < message.extensionRange.length; ++j)
                            object.extensionRange[j] = $root.google.protobuf.DescriptorProto.ExtensionRange.toObject(message.extensionRange[j], options);
                    }
                    if (message.extension && message.extension.length) {
                        object.extension = [];
                        for (var j = 0; j < message.extension.length; ++j)
                            object.extension[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.extension[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.MessageOptions.toObject(message.options, options);
                    if (message.oneofDecl && message.oneofDecl.length) {
                        object.oneofDecl = [];
                        for (var j = 0; j < message.oneofDecl.length; ++j)
                            object.oneofDecl[j] = $root.google.protobuf.OneofDescriptorProto.toObject(message.oneofDecl[j], options);
                    }
                    if (message.reservedRange && message.reservedRange.length) {
                        object.reservedRange = [];
                        for (var j = 0; j < message.reservedRange.length; ++j)
                            object.reservedRange[j] = $root.google.protobuf.DescriptorProto.ReservedRange.toObject(message.reservedRange[j], options);
                    }
                    if (message.reservedName && message.reservedName.length) {
                        object.reservedName = [];
                        for (var j = 0; j < message.reservedName.length; ++j)
                            object.reservedName[j] = message.reservedName[j];
                    }
                    if (message.visibility != null && message.hasOwnProperty("visibility"))
                        object.visibility = options.enums === String ? $root.google.protobuf.SymbolVisibility[message.visibility] === undefined ? message.visibility : $root.google.protobuf.SymbolVisibility[message.visibility] : message.visibility;
                    return object;
                };
    
                /**
                 * Converts this DescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for DescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                DescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.DescriptorProto";
                };
    
                DescriptorProto.ExtensionRange = (function() {
    
                    /**
                     * Properties of an ExtensionRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @interface IExtensionRange
                     * @property {number|null} [start] ExtensionRange start
                     * @property {number|null} [end] ExtensionRange end
                     * @property {google.protobuf.IExtensionRangeOptions|null} [options] ExtensionRange options
                     */
    
                    /**
                     * Constructs a new ExtensionRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @classdesc Represents an ExtensionRange.
                     * @implements IExtensionRange
                     * @constructor
                     * @param {google.protobuf.DescriptorProto.IExtensionRange=} [properties] Properties to set
                     */
                    function ExtensionRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExtensionRange start.
                     * @member {number} start
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.start = 0;
    
                    /**
                     * ExtensionRange end.
                     * @member {number} end
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.end = 0;
    
                    /**
                     * ExtensionRange options.
                     * @member {google.protobuf.IExtensionRangeOptions|null|undefined} options
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.options = null;
    
                    /**
                     * Creates a new ExtensionRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange=} [properties] Properties to set
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange instance
                     */
                    ExtensionRange.create = function create(properties) {
                        return new ExtensionRange(properties);
                    };
    
                    /**
                     * Encodes the specified ExtensionRange message. Does not implicitly {@link google.protobuf.DescriptorProto.ExtensionRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange} message ExtensionRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExtensionRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                            $root.google.protobuf.ExtensionRangeOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExtensionRange message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.ExtensionRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange} message ExtensionRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExtensionRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExtensionRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExtensionRange.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto.ExtensionRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.start = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.end = reader.int32();
                                    break;
                                }
                            case 3: {
                                    message.options = $root.google.protobuf.ExtensionRangeOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExtensionRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExtensionRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExtensionRange message.
                     * @function verify
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExtensionRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        if (message.options != null && message.hasOwnProperty("options")) {
                            var error = $root.google.protobuf.ExtensionRangeOptions.verify(message.options);
                            if (error)
                                return "options." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an ExtensionRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     */
                    ExtensionRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.DescriptorProto.ExtensionRange)
                            return object;
                        var message = new $root.google.protobuf.DescriptorProto.ExtensionRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        if (object.options != null) {
                            if (typeof object.options !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.ExtensionRange.options: object expected");
                            message.options = $root.google.protobuf.ExtensionRangeOptions.fromObject(object.options);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExtensionRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.ExtensionRange} message ExtensionRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExtensionRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                            object.options = null;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        if (message.options != null && message.hasOwnProperty("options"))
                            object.options = $root.google.protobuf.ExtensionRangeOptions.toObject(message.options, options);
                        return object;
                    };
    
                    /**
                     * Converts this ExtensionRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExtensionRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ExtensionRange
                     * @function getTypeUrl
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ExtensionRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.DescriptorProto.ExtensionRange";
                    };
    
                    return ExtensionRange;
                })();
    
                DescriptorProto.ReservedRange = (function() {
    
                    /**
                     * Properties of a ReservedRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @interface IReservedRange
                     * @property {number|null} [start] ReservedRange start
                     * @property {number|null} [end] ReservedRange end
                     */
    
                    /**
                     * Constructs a new ReservedRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @classdesc Represents a ReservedRange.
                     * @implements IReservedRange
                     * @constructor
                     * @param {google.protobuf.DescriptorProto.IReservedRange=} [properties] Properties to set
                     */
                    function ReservedRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ReservedRange start.
                     * @member {number} start
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     */
                    ReservedRange.prototype.start = 0;
    
                    /**
                     * ReservedRange end.
                     * @member {number} end
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     */
                    ReservedRange.prototype.end = 0;
    
                    /**
                     * Creates a new ReservedRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange=} [properties] Properties to set
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange instance
                     */
                    ReservedRange.create = function create(properties) {
                        return new ReservedRange(properties);
                    };
    
                    /**
                     * Encodes the specified ReservedRange message. Does not implicitly {@link google.protobuf.DescriptorProto.ReservedRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange} message ReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReservedRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ReservedRange message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.ReservedRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange} message ReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReservedRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ReservedRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReservedRange.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto.ReservedRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.start = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.end = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ReservedRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReservedRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ReservedRange message.
                     * @function verify
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ReservedRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ReservedRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     */
                    ReservedRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.DescriptorProto.ReservedRange)
                            return object;
                        var message = new $root.google.protobuf.DescriptorProto.ReservedRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ReservedRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.ReservedRange} message ReservedRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ReservedRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        return object;
                    };
    
                    /**
                     * Converts this ReservedRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ReservedRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ReservedRange
                     * @function getTypeUrl
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ReservedRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.DescriptorProto.ReservedRange";
                    };
    
                    return ReservedRange;
                })();
    
                return DescriptorProto;
            })();
    
            protobuf.ExtensionRangeOptions = (function() {
    
                /**
                 * Properties of an ExtensionRangeOptions.
                 * @memberof google.protobuf
                 * @interface IExtensionRangeOptions
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] ExtensionRangeOptions uninterpretedOption
                 * @property {Array.<google.protobuf.ExtensionRangeOptions.IDeclaration>|null} [declaration] ExtensionRangeOptions declaration
                 * @property {google.protobuf.IFeatureSet|null} [features] ExtensionRangeOptions features
                 * @property {google.protobuf.ExtensionRangeOptions.VerificationState|null} [verification] ExtensionRangeOptions verification
                 */
    
                /**
                 * Constructs a new ExtensionRangeOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an ExtensionRangeOptions.
                 * @implements IExtensionRangeOptions
                 * @constructor
                 * @param {google.protobuf.IExtensionRangeOptions=} [properties] Properties to set
                 */
                function ExtensionRangeOptions(properties) {
                    this.uninterpretedOption = [];
                    this.declaration = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ExtensionRangeOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 */
                ExtensionRangeOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * ExtensionRangeOptions declaration.
                 * @member {Array.<google.protobuf.ExtensionRangeOptions.IDeclaration>} declaration
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 */
                ExtensionRangeOptions.prototype.declaration = $util.emptyArray;
    
                /**
                 * ExtensionRangeOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 */
                ExtensionRangeOptions.prototype.features = null;
    
                /**
                 * ExtensionRangeOptions verification.
                 * @member {google.protobuf.ExtensionRangeOptions.VerificationState} verification
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 */
                ExtensionRangeOptions.prototype.verification = 1;
    
                /**
                 * Creates a new ExtensionRangeOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions=} [properties] Properties to set
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions instance
                 */
                ExtensionRangeOptions.create = function create(properties) {
                    return new ExtensionRangeOptions(properties);
                };
    
                /**
                 * Encodes the specified ExtensionRangeOptions message. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions} message ExtensionRangeOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ExtensionRangeOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.declaration != null && message.declaration.length)
                        for (var i = 0; i < message.declaration.length; ++i)
                            $root.google.protobuf.ExtensionRangeOptions.Declaration.encode(message.declaration[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.verification != null && Object.hasOwnProperty.call(message, "verification"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.verification);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 50, wireType 2 =*/402).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ExtensionRangeOptions message, length delimited. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions} message ExtensionRangeOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ExtensionRangeOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an ExtensionRangeOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ExtensionRangeOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ExtensionRangeOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 2: {
                                if (!(message.declaration && message.declaration.length))
                                    message.declaration = [];
                                message.declaration.push($root.google.protobuf.ExtensionRangeOptions.Declaration.decode(reader, reader.uint32()));
                                break;
                            }
                        case 50: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 3: {
                                message.verification = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an ExtensionRangeOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ExtensionRangeOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an ExtensionRangeOptions message.
                 * @function verify
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ExtensionRangeOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message.declaration != null && message.hasOwnProperty("declaration")) {
                        if (!Array.isArray(message.declaration))
                            return "declaration: array expected";
                        for (var i = 0; i < message.declaration.length; ++i) {
                            var error = $root.google.protobuf.ExtensionRangeOptions.Declaration.verify(message.declaration[i]);
                            if (error)
                                return "declaration." + error;
                        }
                    }
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.verification != null && message.hasOwnProperty("verification"))
                        switch (message.verification) {
                        default:
                            return "verification: enum value expected";
                        case 0:
                        case 1:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates an ExtensionRangeOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 */
                ExtensionRangeOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ExtensionRangeOptions)
                        return object;
                    var message = new $root.google.protobuf.ExtensionRangeOptions();
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.ExtensionRangeOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.ExtensionRangeOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object.declaration) {
                        if (!Array.isArray(object.declaration))
                            throw TypeError(".google.protobuf.ExtensionRangeOptions.declaration: array expected");
                        message.declaration = [];
                        for (var i = 0; i < object.declaration.length; ++i) {
                            if (typeof object.declaration[i] !== "object")
                                throw TypeError(".google.protobuf.ExtensionRangeOptions.declaration: object expected");
                            message.declaration[i] = $root.google.protobuf.ExtensionRangeOptions.Declaration.fromObject(object.declaration[i]);
                        }
                    }
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.ExtensionRangeOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    switch (object.verification) {
                    case "DECLARATION":
                    case 0:
                        message.verification = 0;
                        break;
                    default:
                        if (typeof object.verification === "number") {
                            message.verification = object.verification;
                            break;
                        }
                        break;
                    case "UNVERIFIED":
                    case 1:
                        message.verification = 1;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an ExtensionRangeOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.ExtensionRangeOptions} message ExtensionRangeOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ExtensionRangeOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.declaration = [];
                        object.uninterpretedOption = [];
                    }
                    if (options.defaults) {
                        object.verification = options.enums === String ? "UNVERIFIED" : 1;
                        object.features = null;
                    }
                    if (message.declaration && message.declaration.length) {
                        object.declaration = [];
                        for (var j = 0; j < message.declaration.length; ++j)
                            object.declaration[j] = $root.google.protobuf.ExtensionRangeOptions.Declaration.toObject(message.declaration[j], options);
                    }
                    if (message.verification != null && message.hasOwnProperty("verification"))
                        object.verification = options.enums === String ? $root.google.protobuf.ExtensionRangeOptions.VerificationState[message.verification] === undefined ? message.verification : $root.google.protobuf.ExtensionRangeOptions.VerificationState[message.verification] : message.verification;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this ExtensionRangeOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ExtensionRangeOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ExtensionRangeOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ExtensionRangeOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.ExtensionRangeOptions";
                };
    
                ExtensionRangeOptions.Declaration = (function() {
    
                    /**
                     * Properties of a Declaration.
                     * @memberof google.protobuf.ExtensionRangeOptions
                     * @interface IDeclaration
                     * @property {number|null} [number] Declaration number
                     * @property {string|null} [fullName] Declaration fullName
                     * @property {string|null} [type] Declaration type
                     * @property {boolean|null} [reserved] Declaration reserved
                     * @property {boolean|null} [repeated] Declaration repeated
                     */
    
                    /**
                     * Constructs a new Declaration.
                     * @memberof google.protobuf.ExtensionRangeOptions
                     * @classdesc Represents a Declaration.
                     * @implements IDeclaration
                     * @constructor
                     * @param {google.protobuf.ExtensionRangeOptions.IDeclaration=} [properties] Properties to set
                     */
                    function Declaration(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Declaration number.
                     * @member {number} number
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     */
                    Declaration.prototype.number = 0;
    
                    /**
                     * Declaration fullName.
                     * @member {string} fullName
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     */
                    Declaration.prototype.fullName = "";
    
                    /**
                     * Declaration type.
                     * @member {string} type
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     */
                    Declaration.prototype.type = "";
    
                    /**
                     * Declaration reserved.
                     * @member {boolean} reserved
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     */
                    Declaration.prototype.reserved = false;
    
                    /**
                     * Declaration repeated.
                     * @member {boolean} repeated
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     */
                    Declaration.prototype.repeated = false;
    
                    /**
                     * Creates a new Declaration instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {google.protobuf.ExtensionRangeOptions.IDeclaration=} [properties] Properties to set
                     * @returns {google.protobuf.ExtensionRangeOptions.Declaration} Declaration instance
                     */
                    Declaration.create = function create(properties) {
                        return new Declaration(properties);
                    };
    
                    /**
                     * Encodes the specified Declaration message. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.Declaration.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {google.protobuf.ExtensionRangeOptions.IDeclaration} message Declaration message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Declaration.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.number != null && Object.hasOwnProperty.call(message, "number"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.number);
                        if (message.fullName != null && Object.hasOwnProperty.call(message, "fullName"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.fullName);
                        if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.type);
                        if (message.reserved != null && Object.hasOwnProperty.call(message, "reserved"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.reserved);
                        if (message.repeated != null && Object.hasOwnProperty.call(message, "repeated"))
                            writer.uint32(/* id 6, wireType 0 =*/48).bool(message.repeated);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Declaration message, length delimited. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.Declaration.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {google.protobuf.ExtensionRangeOptions.IDeclaration} message Declaration message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Declaration.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Declaration message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.ExtensionRangeOptions.Declaration} Declaration
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Declaration.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ExtensionRangeOptions.Declaration();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.number = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.fullName = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.type = reader.string();
                                    break;
                                }
                            case 5: {
                                    message.reserved = reader.bool();
                                    break;
                                }
                            case 6: {
                                    message.repeated = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Declaration message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.ExtensionRangeOptions.Declaration} Declaration
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Declaration.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Declaration message.
                     * @function verify
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Declaration.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.number != null && message.hasOwnProperty("number"))
                            if (!$util.isInteger(message.number))
                                return "number: integer expected";
                        if (message.fullName != null && message.hasOwnProperty("fullName"))
                            if (!$util.isString(message.fullName))
                                return "fullName: string expected";
                        if (message.type != null && message.hasOwnProperty("type"))
                            if (!$util.isString(message.type))
                                return "type: string expected";
                        if (message.reserved != null && message.hasOwnProperty("reserved"))
                            if (typeof message.reserved !== "boolean")
                                return "reserved: boolean expected";
                        if (message.repeated != null && message.hasOwnProperty("repeated"))
                            if (typeof message.repeated !== "boolean")
                                return "repeated: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a Declaration message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.ExtensionRangeOptions.Declaration} Declaration
                     */
                    Declaration.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.ExtensionRangeOptions.Declaration)
                            return object;
                        var message = new $root.google.protobuf.ExtensionRangeOptions.Declaration();
                        if (object.number != null)
                            message.number = object.number | 0;
                        if (object.fullName != null)
                            message.fullName = String(object.fullName);
                        if (object.type != null)
                            message.type = String(object.type);
                        if (object.reserved != null)
                            message.reserved = Boolean(object.reserved);
                        if (object.repeated != null)
                            message.repeated = Boolean(object.repeated);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Declaration message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {google.protobuf.ExtensionRangeOptions.Declaration} message Declaration
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Declaration.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.number = 0;
                            object.fullName = "";
                            object.type = "";
                            object.reserved = false;
                            object.repeated = false;
                        }
                        if (message.number != null && message.hasOwnProperty("number"))
                            object.number = message.number;
                        if (message.fullName != null && message.hasOwnProperty("fullName"))
                            object.fullName = message.fullName;
                        if (message.type != null && message.hasOwnProperty("type"))
                            object.type = message.type;
                        if (message.reserved != null && message.hasOwnProperty("reserved"))
                            object.reserved = message.reserved;
                        if (message.repeated != null && message.hasOwnProperty("repeated"))
                            object.repeated = message.repeated;
                        return object;
                    };
    
                    /**
                     * Converts this Declaration to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Declaration.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Declaration
                     * @function getTypeUrl
                     * @memberof google.protobuf.ExtensionRangeOptions.Declaration
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Declaration.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.ExtensionRangeOptions.Declaration";
                    };
    
                    return Declaration;
                })();
    
                /**
                 * VerificationState enum.
                 * @name google.protobuf.ExtensionRangeOptions.VerificationState
                 * @enum {number}
                 * @property {number} DECLARATION=0 DECLARATION value
                 * @property {number} UNVERIFIED=1 UNVERIFIED value
                 */
                ExtensionRangeOptions.VerificationState = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "DECLARATION"] = 0;
                    values[valuesById[1] = "UNVERIFIED"] = 1;
                    return values;
                })();
    
                return ExtensionRangeOptions;
            })();
    
            protobuf.FieldDescriptorProto = (function() {
    
                /**
                 * Properties of a FieldDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IFieldDescriptorProto
                 * @property {string|null} [name] FieldDescriptorProto name
                 * @property {number|null} [number] FieldDescriptorProto number
                 * @property {google.protobuf.FieldDescriptorProto.Label|null} [label] FieldDescriptorProto label
                 * @property {google.protobuf.FieldDescriptorProto.Type|null} [type] FieldDescriptorProto type
                 * @property {string|null} [typeName] FieldDescriptorProto typeName
                 * @property {string|null} [extendee] FieldDescriptorProto extendee
                 * @property {string|null} [defaultValue] FieldDescriptorProto defaultValue
                 * @property {number|null} [oneofIndex] FieldDescriptorProto oneofIndex
                 * @property {string|null} [jsonName] FieldDescriptorProto jsonName
                 * @property {google.protobuf.IFieldOptions|null} [options] FieldDescriptorProto options
                 * @property {boolean|null} [proto3Optional] FieldDescriptorProto proto3Optional
                 */
    
                /**
                 * Constructs a new FieldDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldDescriptorProto.
                 * @implements IFieldDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IFieldDescriptorProto=} [properties] Properties to set
                 */
                function FieldDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.name = "";
    
                /**
                 * FieldDescriptorProto number.
                 * @member {number} number
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.number = 0;
    
                /**
                 * FieldDescriptorProto label.
                 * @member {google.protobuf.FieldDescriptorProto.Label} label
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.label = 1;
    
                /**
                 * FieldDescriptorProto type.
                 * @member {google.protobuf.FieldDescriptorProto.Type} type
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.type = 1;
    
                /**
                 * FieldDescriptorProto typeName.
                 * @member {string} typeName
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.typeName = "";
    
                /**
                 * FieldDescriptorProto extendee.
                 * @member {string} extendee
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.extendee = "";
    
                /**
                 * FieldDescriptorProto defaultValue.
                 * @member {string} defaultValue
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.defaultValue = "";
    
                /**
                 * FieldDescriptorProto oneofIndex.
                 * @member {number} oneofIndex
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.oneofIndex = 0;
    
                /**
                 * FieldDescriptorProto jsonName.
                 * @member {string} jsonName
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.jsonName = "";
    
                /**
                 * FieldDescriptorProto options.
                 * @member {google.protobuf.IFieldOptions|null|undefined} options
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.options = null;
    
                /**
                 * FieldDescriptorProto proto3Optional.
                 * @member {boolean} proto3Optional
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.proto3Optional = false;
    
                /**
                 * Creates a new FieldDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto instance
                 */
                FieldDescriptorProto.create = function create(properties) {
                    return new FieldDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified FieldDescriptorProto message. Does not implicitly {@link google.protobuf.FieldDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto} message FieldDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.extendee != null && Object.hasOwnProperty.call(message, "extendee"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.extendee);
                    if (message.number != null && Object.hasOwnProperty.call(message, "number"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.number);
                    if (message.label != null && Object.hasOwnProperty.call(message, "label"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.label);
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int32(message.type);
                    if (message.typeName != null && Object.hasOwnProperty.call(message, "typeName"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.typeName);
                    if (message.defaultValue != null && Object.hasOwnProperty.call(message, "defaultValue"))
                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.defaultValue);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.FieldOptions.encode(message.options, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.oneofIndex != null && Object.hasOwnProperty.call(message, "oneofIndex"))
                        writer.uint32(/* id 9, wireType 0 =*/72).int32(message.oneofIndex);
                    if (message.jsonName != null && Object.hasOwnProperty.call(message, "jsonName"))
                        writer.uint32(/* id 10, wireType 2 =*/82).string(message.jsonName);
                    if (message.proto3Optional != null && Object.hasOwnProperty.call(message, "proto3Optional"))
                        writer.uint32(/* id 17, wireType 0 =*/136).bool(message.proto3Optional);
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.FieldDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto} message FieldDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 3: {
                                message.number = reader.int32();
                                break;
                            }
                        case 4: {
                                message.label = reader.int32();
                                break;
                            }
                        case 5: {
                                message.type = reader.int32();
                                break;
                            }
                        case 6: {
                                message.typeName = reader.string();
                                break;
                            }
                        case 2: {
                                message.extendee = reader.string();
                                break;
                            }
                        case 7: {
                                message.defaultValue = reader.string();
                                break;
                            }
                        case 9: {
                                message.oneofIndex = reader.int32();
                                break;
                            }
                        case 10: {
                                message.jsonName = reader.string();
                                break;
                            }
                        case 8: {
                                message.options = $root.google.protobuf.FieldOptions.decode(reader, reader.uint32());
                                break;
                            }
                        case 17: {
                                message.proto3Optional = reader.bool();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.number != null && message.hasOwnProperty("number"))
                        if (!$util.isInteger(message.number))
                            return "number: integer expected";
                    if (message.label != null && message.hasOwnProperty("label"))
                        switch (message.label) {
                        default:
                            return "label: enum value expected";
                        case 1:
                        case 3:
                        case 2:
                            break;
                        }
                    if (message.type != null && message.hasOwnProperty("type"))
                        switch (message.type) {
                        default:
                            return "type: enum value expected";
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                        case 10:
                        case 11:
                        case 12:
                        case 13:
                        case 14:
                        case 15:
                        case 16:
                        case 17:
                        case 18:
                            break;
                        }
                    if (message.typeName != null && message.hasOwnProperty("typeName"))
                        if (!$util.isString(message.typeName))
                            return "typeName: string expected";
                    if (message.extendee != null && message.hasOwnProperty("extendee"))
                        if (!$util.isString(message.extendee))
                            return "extendee: string expected";
                    if (message.defaultValue != null && message.hasOwnProperty("defaultValue"))
                        if (!$util.isString(message.defaultValue))
                            return "defaultValue: string expected";
                    if (message.oneofIndex != null && message.hasOwnProperty("oneofIndex"))
                        if (!$util.isInteger(message.oneofIndex))
                            return "oneofIndex: integer expected";
                    if (message.jsonName != null && message.hasOwnProperty("jsonName"))
                        if (!$util.isString(message.jsonName))
                            return "jsonName: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.FieldOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.proto3Optional != null && message.hasOwnProperty("proto3Optional"))
                        if (typeof message.proto3Optional !== "boolean")
                            return "proto3Optional: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a FieldDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 */
                FieldDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.FieldDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.number != null)
                        message.number = object.number | 0;
                    switch (object.label) {
                    default:
                        if (typeof object.label === "number") {
                            message.label = object.label;
                            break;
                        }
                        break;
                    case "LABEL_OPTIONAL":
                    case 1:
                        message.label = 1;
                        break;
                    case "LABEL_REPEATED":
                    case 3:
                        message.label = 3;
                        break;
                    case "LABEL_REQUIRED":
                    case 2:
                        message.label = 2;
                        break;
                    }
                    switch (object.type) {
                    default:
                        if (typeof object.type === "number") {
                            message.type = object.type;
                            break;
                        }
                        break;
                    case "TYPE_DOUBLE":
                    case 1:
                        message.type = 1;
                        break;
                    case "TYPE_FLOAT":
                    case 2:
                        message.type = 2;
                        break;
                    case "TYPE_INT64":
                    case 3:
                        message.type = 3;
                        break;
                    case "TYPE_UINT64":
                    case 4:
                        message.type = 4;
                        break;
                    case "TYPE_INT32":
                    case 5:
                        message.type = 5;
                        break;
                    case "TYPE_FIXED64":
                    case 6:
                        message.type = 6;
                        break;
                    case "TYPE_FIXED32":
                    case 7:
                        message.type = 7;
                        break;
                    case "TYPE_BOOL":
                    case 8:
                        message.type = 8;
                        break;
                    case "TYPE_STRING":
                    case 9:
                        message.type = 9;
                        break;
                    case "TYPE_GROUP":
                    case 10:
                        message.type = 10;
                        break;
                    case "TYPE_MESSAGE":
                    case 11:
                        message.type = 11;
                        break;
                    case "TYPE_BYTES":
                    case 12:
                        message.type = 12;
                        break;
                    case "TYPE_UINT32":
                    case 13:
                        message.type = 13;
                        break;
                    case "TYPE_ENUM":
                    case 14:
                        message.type = 14;
                        break;
                    case "TYPE_SFIXED32":
                    case 15:
                        message.type = 15;
                        break;
                    case "TYPE_SFIXED64":
                    case 16:
                        message.type = 16;
                        break;
                    case "TYPE_SINT32":
                    case 17:
                        message.type = 17;
                        break;
                    case "TYPE_SINT64":
                    case 18:
                        message.type = 18;
                        break;
                    }
                    if (object.typeName != null)
                        message.typeName = String(object.typeName);
                    if (object.extendee != null)
                        message.extendee = String(object.extendee);
                    if (object.defaultValue != null)
                        message.defaultValue = String(object.defaultValue);
                    if (object.oneofIndex != null)
                        message.oneofIndex = object.oneofIndex | 0;
                    if (object.jsonName != null)
                        message.jsonName = String(object.jsonName);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.FieldDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.FieldOptions.fromObject(object.options);
                    }
                    if (object.proto3Optional != null)
                        message.proto3Optional = Boolean(object.proto3Optional);
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.FieldDescriptorProto} message FieldDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.extendee = "";
                        object.number = 0;
                        object.label = options.enums === String ? "LABEL_OPTIONAL" : 1;
                        object.type = options.enums === String ? "TYPE_DOUBLE" : 1;
                        object.typeName = "";
                        object.defaultValue = "";
                        object.options = null;
                        object.oneofIndex = 0;
                        object.jsonName = "";
                        object.proto3Optional = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.extendee != null && message.hasOwnProperty("extendee"))
                        object.extendee = message.extendee;
                    if (message.number != null && message.hasOwnProperty("number"))
                        object.number = message.number;
                    if (message.label != null && message.hasOwnProperty("label"))
                        object.label = options.enums === String ? $root.google.protobuf.FieldDescriptorProto.Label[message.label] === undefined ? message.label : $root.google.protobuf.FieldDescriptorProto.Label[message.label] : message.label;
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = options.enums === String ? $root.google.protobuf.FieldDescriptorProto.Type[message.type] === undefined ? message.type : $root.google.protobuf.FieldDescriptorProto.Type[message.type] : message.type;
                    if (message.typeName != null && message.hasOwnProperty("typeName"))
                        object.typeName = message.typeName;
                    if (message.defaultValue != null && message.hasOwnProperty("defaultValue"))
                        object.defaultValue = message.defaultValue;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.FieldOptions.toObject(message.options, options);
                    if (message.oneofIndex != null && message.hasOwnProperty("oneofIndex"))
                        object.oneofIndex = message.oneofIndex;
                    if (message.jsonName != null && message.hasOwnProperty("jsonName"))
                        object.jsonName = message.jsonName;
                    if (message.proto3Optional != null && message.hasOwnProperty("proto3Optional"))
                        object.proto3Optional = message.proto3Optional;
                    return object;
                };
    
                /**
                 * Converts this FieldDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FieldDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FieldDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FieldDescriptorProto";
                };
    
                /**
                 * Type enum.
                 * @name google.protobuf.FieldDescriptorProto.Type
                 * @enum {number}
                 * @property {number} TYPE_DOUBLE=1 TYPE_DOUBLE value
                 * @property {number} TYPE_FLOAT=2 TYPE_FLOAT value
                 * @property {number} TYPE_INT64=3 TYPE_INT64 value
                 * @property {number} TYPE_UINT64=4 TYPE_UINT64 value
                 * @property {number} TYPE_INT32=5 TYPE_INT32 value
                 * @property {number} TYPE_FIXED64=6 TYPE_FIXED64 value
                 * @property {number} TYPE_FIXED32=7 TYPE_FIXED32 value
                 * @property {number} TYPE_BOOL=8 TYPE_BOOL value
                 * @property {number} TYPE_STRING=9 TYPE_STRING value
                 * @property {number} TYPE_GROUP=10 TYPE_GROUP value
                 * @property {number} TYPE_MESSAGE=11 TYPE_MESSAGE value
                 * @property {number} TYPE_BYTES=12 TYPE_BYTES value
                 * @property {number} TYPE_UINT32=13 TYPE_UINT32 value
                 * @property {number} TYPE_ENUM=14 TYPE_ENUM value
                 * @property {number} TYPE_SFIXED32=15 TYPE_SFIXED32 value
                 * @property {number} TYPE_SFIXED64=16 TYPE_SFIXED64 value
                 * @property {number} TYPE_SINT32=17 TYPE_SINT32 value
                 * @property {number} TYPE_SINT64=18 TYPE_SINT64 value
                 */
                FieldDescriptorProto.Type = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "TYPE_DOUBLE"] = 1;
                    values[valuesById[2] = "TYPE_FLOAT"] = 2;
                    values[valuesById[3] = "TYPE_INT64"] = 3;
                    values[valuesById[4] = "TYPE_UINT64"] = 4;
                    values[valuesById[5] = "TYPE_INT32"] = 5;
                    values[valuesById[6] = "TYPE_FIXED64"] = 6;
                    values[valuesById[7] = "TYPE_FIXED32"] = 7;
                    values[valuesById[8] = "TYPE_BOOL"] = 8;
                    values[valuesById[9] = "TYPE_STRING"] = 9;
                    values[valuesById[10] = "TYPE_GROUP"] = 10;
                    values[valuesById[11] = "TYPE_MESSAGE"] = 11;
                    values[valuesById[12] = "TYPE_BYTES"] = 12;
                    values[valuesById[13] = "TYPE_UINT32"] = 13;
                    values[valuesById[14] = "TYPE_ENUM"] = 14;
                    values[valuesById[15] = "TYPE_SFIXED32"] = 15;
                    values[valuesById[16] = "TYPE_SFIXED64"] = 16;
                    values[valuesById[17] = "TYPE_SINT32"] = 17;
                    values[valuesById[18] = "TYPE_SINT64"] = 18;
                    return values;
                })();
    
                /**
                 * Label enum.
                 * @name google.protobuf.FieldDescriptorProto.Label
                 * @enum {number}
                 * @property {number} LABEL_OPTIONAL=1 LABEL_OPTIONAL value
                 * @property {number} LABEL_REPEATED=3 LABEL_REPEATED value
                 * @property {number} LABEL_REQUIRED=2 LABEL_REQUIRED value
                 */
                FieldDescriptorProto.Label = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "LABEL_OPTIONAL"] = 1;
                    values[valuesById[3] = "LABEL_REPEATED"] = 3;
                    values[valuesById[2] = "LABEL_REQUIRED"] = 2;
                    return values;
                })();
    
                return FieldDescriptorProto;
            })();
    
            protobuf.OneofDescriptorProto = (function() {
    
                /**
                 * Properties of an OneofDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IOneofDescriptorProto
                 * @property {string|null} [name] OneofDescriptorProto name
                 * @property {google.protobuf.IOneofOptions|null} [options] OneofDescriptorProto options
                 */
    
                /**
                 * Constructs a new OneofDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an OneofDescriptorProto.
                 * @implements IOneofDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IOneofDescriptorProto=} [properties] Properties to set
                 */
                function OneofDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OneofDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 */
                OneofDescriptorProto.prototype.name = "";
    
                /**
                 * OneofDescriptorProto options.
                 * @member {google.protobuf.IOneofOptions|null|undefined} options
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 */
                OneofDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new OneofDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto instance
                 */
                OneofDescriptorProto.create = function create(properties) {
                    return new OneofDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified OneofDescriptorProto message. Does not implicitly {@link google.protobuf.OneofDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto} message OneofDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.OneofOptions.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified OneofDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.OneofDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto} message OneofDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OneofDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.OneofDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message.options = $root.google.protobuf.OneofOptions.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OneofDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OneofDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OneofDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.OneofOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates an OneofDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 */
                OneofDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.OneofDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.OneofDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.OneofDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.OneofOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an OneofDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.OneofDescriptorProto} message OneofDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OneofDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.OneofOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this OneofDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OneofDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for OneofDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                OneofDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.OneofDescriptorProto";
                };
    
                return OneofDescriptorProto;
            })();
    
            protobuf.EnumDescriptorProto = (function() {
    
                /**
                 * Properties of an EnumDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IEnumDescriptorProto
                 * @property {string|null} [name] EnumDescriptorProto name
                 * @property {Array.<google.protobuf.IEnumValueDescriptorProto>|null} [value] EnumDescriptorProto value
                 * @property {google.protobuf.IEnumOptions|null} [options] EnumDescriptorProto options
                 * @property {Array.<google.protobuf.EnumDescriptorProto.IEnumReservedRange>|null} [reservedRange] EnumDescriptorProto reservedRange
                 * @property {Array.<string>|null} [reservedName] EnumDescriptorProto reservedName
                 * @property {google.protobuf.SymbolVisibility|null} [visibility] EnumDescriptorProto visibility
                 */
    
                /**
                 * Constructs a new EnumDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumDescriptorProto.
                 * @implements IEnumDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IEnumDescriptorProto=} [properties] Properties to set
                 */
                function EnumDescriptorProto(properties) {
                    this.value = [];
                    this.reservedRange = [];
                    this.reservedName = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.name = "";
    
                /**
                 * EnumDescriptorProto value.
                 * @member {Array.<google.protobuf.IEnumValueDescriptorProto>} value
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.value = $util.emptyArray;
    
                /**
                 * EnumDescriptorProto options.
                 * @member {google.protobuf.IEnumOptions|null|undefined} options
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.options = null;
    
                /**
                 * EnumDescriptorProto reservedRange.
                 * @member {Array.<google.protobuf.EnumDescriptorProto.IEnumReservedRange>} reservedRange
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.reservedRange = $util.emptyArray;
    
                /**
                 * EnumDescriptorProto reservedName.
                 * @member {Array.<string>} reservedName
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.reservedName = $util.emptyArray;
    
                /**
                 * EnumDescriptorProto visibility.
                 * @member {google.protobuf.SymbolVisibility} visibility
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.visibility = 0;
    
                /**
                 * Creates a new EnumDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto instance
                 */
                EnumDescriptorProto.create = function create(properties) {
                    return new EnumDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified EnumDescriptorProto message. Does not implicitly {@link google.protobuf.EnumDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto} message EnumDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.value != null && message.value.length)
                        for (var i = 0; i < message.value.length; ++i)
                            $root.google.protobuf.EnumValueDescriptorProto.encode(message.value[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.EnumOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    if (message.reservedRange != null && message.reservedRange.length)
                        for (var i = 0; i < message.reservedRange.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.encode(message.reservedRange[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.reservedName != null && message.reservedName.length)
                        for (var i = 0; i < message.reservedName.length; ++i)
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.reservedName[i]);
                    if (message.visibility != null && Object.hasOwnProperty.call(message, "visibility"))
                        writer.uint32(/* id 6, wireType 0 =*/48).int32(message.visibility);
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.EnumDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto} message EnumDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                if (!(message.value && message.value.length))
                                    message.value = [];
                                message.value.push($root.google.protobuf.EnumValueDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 3: {
                                message.options = $root.google.protobuf.EnumOptions.decode(reader, reader.uint32());
                                break;
                            }
                        case 4: {
                                if (!(message.reservedRange && message.reservedRange.length))
                                    message.reservedRange = [];
                                message.reservedRange.push($root.google.protobuf.EnumDescriptorProto.EnumReservedRange.decode(reader, reader.uint32()));
                                break;
                            }
                        case 5: {
                                if (!(message.reservedName && message.reservedName.length))
                                    message.reservedName = [];
                                message.reservedName.push(reader.string());
                                break;
                            }
                        case 6: {
                                message.visibility = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.value != null && message.hasOwnProperty("value")) {
                        if (!Array.isArray(message.value))
                            return "value: array expected";
                        for (var i = 0; i < message.value.length; ++i) {
                            var error = $root.google.protobuf.EnumValueDescriptorProto.verify(message.value[i]);
                            if (error)
                                return "value." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.EnumOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.reservedRange != null && message.hasOwnProperty("reservedRange")) {
                        if (!Array.isArray(message.reservedRange))
                            return "reservedRange: array expected";
                        for (var i = 0; i < message.reservedRange.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.verify(message.reservedRange[i]);
                            if (error)
                                return "reservedRange." + error;
                        }
                    }
                    if (message.reservedName != null && message.hasOwnProperty("reservedName")) {
                        if (!Array.isArray(message.reservedName))
                            return "reservedName: array expected";
                        for (var i = 0; i < message.reservedName.length; ++i)
                            if (!$util.isString(message.reservedName[i]))
                                return "reservedName: string[] expected";
                    }
                    if (message.visibility != null && message.hasOwnProperty("visibility"))
                        switch (message.visibility) {
                        default:
                            return "visibility: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates an EnumDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 */
                EnumDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.EnumDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.value) {
                        if (!Array.isArray(object.value))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.value: array expected");
                        message.value = [];
                        for (var i = 0; i < object.value.length; ++i) {
                            if (typeof object.value[i] !== "object")
                                throw TypeError(".google.protobuf.EnumDescriptorProto.value: object expected");
                            message.value[i] = $root.google.protobuf.EnumValueDescriptorProto.fromObject(object.value[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.EnumDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.EnumOptions.fromObject(object.options);
                    }
                    if (object.reservedRange) {
                        if (!Array.isArray(object.reservedRange))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.reservedRange: array expected");
                        message.reservedRange = [];
                        for (var i = 0; i < object.reservedRange.length; ++i) {
                            if (typeof object.reservedRange[i] !== "object")
                                throw TypeError(".google.protobuf.EnumDescriptorProto.reservedRange: object expected");
                            message.reservedRange[i] = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.fromObject(object.reservedRange[i]);
                        }
                    }
                    if (object.reservedName) {
                        if (!Array.isArray(object.reservedName))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.reservedName: array expected");
                        message.reservedName = [];
                        for (var i = 0; i < object.reservedName.length; ++i)
                            message.reservedName[i] = String(object.reservedName[i]);
                    }
                    switch (object.visibility) {
                    default:
                        if (typeof object.visibility === "number") {
                            message.visibility = object.visibility;
                            break;
                        }
                        break;
                    case "VISIBILITY_UNSET":
                    case 0:
                        message.visibility = 0;
                        break;
                    case "VISIBILITY_LOCAL":
                    case 1:
                        message.visibility = 1;
                        break;
                    case "VISIBILITY_EXPORT":
                    case 2:
                        message.visibility = 2;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.EnumDescriptorProto} message EnumDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.value = [];
                        object.reservedRange = [];
                        object.reservedName = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                        object.visibility = options.enums === String ? "VISIBILITY_UNSET" : 0;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.value && message.value.length) {
                        object.value = [];
                        for (var j = 0; j < message.value.length; ++j)
                            object.value[j] = $root.google.protobuf.EnumValueDescriptorProto.toObject(message.value[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.EnumOptions.toObject(message.options, options);
                    if (message.reservedRange && message.reservedRange.length) {
                        object.reservedRange = [];
                        for (var j = 0; j < message.reservedRange.length; ++j)
                            object.reservedRange[j] = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.toObject(message.reservedRange[j], options);
                    }
                    if (message.reservedName && message.reservedName.length) {
                        object.reservedName = [];
                        for (var j = 0; j < message.reservedName.length; ++j)
                            object.reservedName[j] = message.reservedName[j];
                    }
                    if (message.visibility != null && message.hasOwnProperty("visibility"))
                        object.visibility = options.enums === String ? $root.google.protobuf.SymbolVisibility[message.visibility] === undefined ? message.visibility : $root.google.protobuf.SymbolVisibility[message.visibility] : message.visibility;
                    return object;
                };
    
                /**
                 * Converts this EnumDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for EnumDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                EnumDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.EnumDescriptorProto";
                };
    
                EnumDescriptorProto.EnumReservedRange = (function() {
    
                    /**
                     * Properties of an EnumReservedRange.
                     * @memberof google.protobuf.EnumDescriptorProto
                     * @interface IEnumReservedRange
                     * @property {number|null} [start] EnumReservedRange start
                     * @property {number|null} [end] EnumReservedRange end
                     */
    
                    /**
                     * Constructs a new EnumReservedRange.
                     * @memberof google.protobuf.EnumDescriptorProto
                     * @classdesc Represents an EnumReservedRange.
                     * @implements IEnumReservedRange
                     * @constructor
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange=} [properties] Properties to set
                     */
                    function EnumReservedRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * EnumReservedRange start.
                     * @member {number} start
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     */
                    EnumReservedRange.prototype.start = 0;
    
                    /**
                     * EnumReservedRange end.
                     * @member {number} end
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     */
                    EnumReservedRange.prototype.end = 0;
    
                    /**
                     * Creates a new EnumReservedRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange=} [properties] Properties to set
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange instance
                     */
                    EnumReservedRange.create = function create(properties) {
                        return new EnumReservedRange(properties);
                    };
    
                    /**
                     * Encodes the specified EnumReservedRange message. Does not implicitly {@link google.protobuf.EnumDescriptorProto.EnumReservedRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange} message EnumReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EnumReservedRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified EnumReservedRange message, length delimited. Does not implicitly {@link google.protobuf.EnumDescriptorProto.EnumReservedRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange} message EnumReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EnumReservedRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an EnumReservedRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EnumReservedRange.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumDescriptorProto.EnumReservedRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.start = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.end = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an EnumReservedRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EnumReservedRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an EnumReservedRange message.
                     * @function verify
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    EnumReservedRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates an EnumReservedRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     */
                    EnumReservedRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.EnumDescriptorProto.EnumReservedRange)
                            return object;
                        var message = new $root.google.protobuf.EnumDescriptorProto.EnumReservedRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an EnumReservedRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.EnumReservedRange} message EnumReservedRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    EnumReservedRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        return object;
                    };
    
                    /**
                     * Converts this EnumReservedRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    EnumReservedRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for EnumReservedRange
                     * @function getTypeUrl
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    EnumReservedRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.EnumDescriptorProto.EnumReservedRange";
                    };
    
                    return EnumReservedRange;
                })();
    
                return EnumDescriptorProto;
            })();
    
            protobuf.EnumValueDescriptorProto = (function() {
    
                /**
                 * Properties of an EnumValueDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IEnumValueDescriptorProto
                 * @property {string|null} [name] EnumValueDescriptorProto name
                 * @property {number|null} [number] EnumValueDescriptorProto number
                 * @property {google.protobuf.IEnumValueOptions|null} [options] EnumValueDescriptorProto options
                 */
    
                /**
                 * Constructs a new EnumValueDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumValueDescriptorProto.
                 * @implements IEnumValueDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IEnumValueDescriptorProto=} [properties] Properties to set
                 */
                function EnumValueDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumValueDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.name = "";
    
                /**
                 * EnumValueDescriptorProto number.
                 * @member {number} number
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.number = 0;
    
                /**
                 * EnumValueDescriptorProto options.
                 * @member {google.protobuf.IEnumValueOptions|null|undefined} options
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new EnumValueDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto instance
                 */
                EnumValueDescriptorProto.create = function create(properties) {
                    return new EnumValueDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified EnumValueDescriptorProto message. Does not implicitly {@link google.protobuf.EnumValueDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto} message EnumValueDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.number != null && Object.hasOwnProperty.call(message, "number"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.number);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.EnumValueOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumValueDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.EnumValueDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto} message EnumValueDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumValueDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumValueDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message.number = reader.int32();
                                break;
                            }
                        case 3: {
                                message.options = $root.google.protobuf.EnumValueOptions.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumValueDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumValueDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumValueDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.number != null && message.hasOwnProperty("number"))
                        if (!$util.isInteger(message.number))
                            return "number: integer expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.EnumValueOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumValueDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 */
                EnumValueDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumValueDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.EnumValueDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.number != null)
                        message.number = object.number | 0;
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.EnumValueDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.EnumValueOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumValueDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.EnumValueDescriptorProto} message EnumValueDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumValueDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.number = 0;
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.number != null && message.hasOwnProperty("number"))
                        object.number = message.number;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.EnumValueOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this EnumValueDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumValueDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for EnumValueDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                EnumValueDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.EnumValueDescriptorProto";
                };
    
                return EnumValueDescriptorProto;
            })();
    
            protobuf.ServiceDescriptorProto = (function() {
    
                /**
                 * Properties of a ServiceDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IServiceDescriptorProto
                 * @property {string|null} [name] ServiceDescriptorProto name
                 * @property {Array.<google.protobuf.IMethodDescriptorProto>|null} [method] ServiceDescriptorProto method
                 * @property {google.protobuf.IServiceOptions|null} [options] ServiceDescriptorProto options
                 */
    
                /**
                 * Constructs a new ServiceDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a ServiceDescriptorProto.
                 * @implements IServiceDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IServiceDescriptorProto=} [properties] Properties to set
                 */
                function ServiceDescriptorProto(properties) {
                    this.method = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ServiceDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.name = "";
    
                /**
                 * ServiceDescriptorProto method.
                 * @member {Array.<google.protobuf.IMethodDescriptorProto>} method
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.method = $util.emptyArray;
    
                /**
                 * ServiceDescriptorProto options.
                 * @member {google.protobuf.IServiceOptions|null|undefined} options
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new ServiceDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto instance
                 */
                ServiceDescriptorProto.create = function create(properties) {
                    return new ServiceDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified ServiceDescriptorProto message. Does not implicitly {@link google.protobuf.ServiceDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto} message ServiceDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.method != null && message.method.length)
                        for (var i = 0; i < message.method.length; ++i)
                            $root.google.protobuf.MethodDescriptorProto.encode(message.method[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.ServiceOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ServiceDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.ServiceDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto} message ServiceDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ServiceDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ServiceDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                if (!(message.method && message.method.length))
                                    message.method = [];
                                message.method.push($root.google.protobuf.MethodDescriptorProto.decode(reader, reader.uint32()));
                                break;
                            }
                        case 3: {
                                message.options = $root.google.protobuf.ServiceOptions.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ServiceDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ServiceDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ServiceDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.method != null && message.hasOwnProperty("method")) {
                        if (!Array.isArray(message.method))
                            return "method: array expected";
                        for (var i = 0; i < message.method.length; ++i) {
                            var error = $root.google.protobuf.MethodDescriptorProto.verify(message.method[i]);
                            if (error)
                                return "method." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.ServiceOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a ServiceDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 */
                ServiceDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ServiceDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.ServiceDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.method) {
                        if (!Array.isArray(object.method))
                            throw TypeError(".google.protobuf.ServiceDescriptorProto.method: array expected");
                        message.method = [];
                        for (var i = 0; i < object.method.length; ++i) {
                            if (typeof object.method[i] !== "object")
                                throw TypeError(".google.protobuf.ServiceDescriptorProto.method: object expected");
                            message.method[i] = $root.google.protobuf.MethodDescriptorProto.fromObject(object.method[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.ServiceDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.ServiceOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ServiceDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.ServiceDescriptorProto} message ServiceDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ServiceDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.method = [];
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.method && message.method.length) {
                        object.method = [];
                        for (var j = 0; j < message.method.length; ++j)
                            object.method[j] = $root.google.protobuf.MethodDescriptorProto.toObject(message.method[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.ServiceOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this ServiceDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ServiceDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ServiceDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ServiceDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.ServiceDescriptorProto";
                };
    
                return ServiceDescriptorProto;
            })();
    
            protobuf.MethodDescriptorProto = (function() {
    
                /**
                 * Properties of a MethodDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IMethodDescriptorProto
                 * @property {string|null} [name] MethodDescriptorProto name
                 * @property {string|null} [inputType] MethodDescriptorProto inputType
                 * @property {string|null} [outputType] MethodDescriptorProto outputType
                 * @property {google.protobuf.IMethodOptions|null} [options] MethodDescriptorProto options
                 * @property {boolean|null} [clientStreaming] MethodDescriptorProto clientStreaming
                 * @property {boolean|null} [serverStreaming] MethodDescriptorProto serverStreaming
                 */
    
                /**
                 * Constructs a new MethodDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a MethodDescriptorProto.
                 * @implements IMethodDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IMethodDescriptorProto=} [properties] Properties to set
                 */
                function MethodDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MethodDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.name = "";
    
                /**
                 * MethodDescriptorProto inputType.
                 * @member {string} inputType
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.inputType = "";
    
                /**
                 * MethodDescriptorProto outputType.
                 * @member {string} outputType
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.outputType = "";
    
                /**
                 * MethodDescriptorProto options.
                 * @member {google.protobuf.IMethodOptions|null|undefined} options
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.options = null;
    
                /**
                 * MethodDescriptorProto clientStreaming.
                 * @member {boolean} clientStreaming
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.clientStreaming = false;
    
                /**
                 * MethodDescriptorProto serverStreaming.
                 * @member {boolean} serverStreaming
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.serverStreaming = false;
    
                /**
                 * Creates a new MethodDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto instance
                 */
                MethodDescriptorProto.create = function create(properties) {
                    return new MethodDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified MethodDescriptorProto message. Does not implicitly {@link google.protobuf.MethodDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto} message MethodDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.inputType != null && Object.hasOwnProperty.call(message, "inputType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inputType);
                    if (message.outputType != null && Object.hasOwnProperty.call(message, "outputType"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.outputType);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.MethodOptions.encode(message.options, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.clientStreaming != null && Object.hasOwnProperty.call(message, "clientStreaming"))
                        writer.uint32(/* id 5, wireType 0 =*/40).bool(message.clientStreaming);
                    if (message.serverStreaming != null && Object.hasOwnProperty.call(message, "serverStreaming"))
                        writer.uint32(/* id 6, wireType 0 =*/48).bool(message.serverStreaming);
                    return writer;
                };
    
                /**
                 * Encodes the specified MethodDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.MethodDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto} message MethodDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MethodDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodDescriptorProto.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MethodDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message.inputType = reader.string();
                                break;
                            }
                        case 3: {
                                message.outputType = reader.string();
                                break;
                            }
                        case 4: {
                                message.options = $root.google.protobuf.MethodOptions.decode(reader, reader.uint32());
                                break;
                            }
                        case 5: {
                                message.clientStreaming = reader.bool();
                                break;
                            }
                        case 6: {
                                message.serverStreaming = reader.bool();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MethodDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MethodDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MethodDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.inputType != null && message.hasOwnProperty("inputType"))
                        if (!$util.isString(message.inputType))
                            return "inputType: string expected";
                    if (message.outputType != null && message.hasOwnProperty("outputType"))
                        if (!$util.isString(message.outputType))
                            return "outputType: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.MethodOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.clientStreaming != null && message.hasOwnProperty("clientStreaming"))
                        if (typeof message.clientStreaming !== "boolean")
                            return "clientStreaming: boolean expected";
                    if (message.serverStreaming != null && message.hasOwnProperty("serverStreaming"))
                        if (typeof message.serverStreaming !== "boolean")
                            return "serverStreaming: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a MethodDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 */
                MethodDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MethodDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.MethodDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.inputType != null)
                        message.inputType = String(object.inputType);
                    if (object.outputType != null)
                        message.outputType = String(object.outputType);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.MethodDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.MethodOptions.fromObject(object.options);
                    }
                    if (object.clientStreaming != null)
                        message.clientStreaming = Boolean(object.clientStreaming);
                    if (object.serverStreaming != null)
                        message.serverStreaming = Boolean(object.serverStreaming);
                    return message;
                };
    
                /**
                 * Creates a plain object from a MethodDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.MethodDescriptorProto} message MethodDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MethodDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.inputType = "";
                        object.outputType = "";
                        object.options = null;
                        object.clientStreaming = false;
                        object.serverStreaming = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.inputType != null && message.hasOwnProperty("inputType"))
                        object.inputType = message.inputType;
                    if (message.outputType != null && message.hasOwnProperty("outputType"))
                        object.outputType = message.outputType;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.MethodOptions.toObject(message.options, options);
                    if (message.clientStreaming != null && message.hasOwnProperty("clientStreaming"))
                        object.clientStreaming = message.clientStreaming;
                    if (message.serverStreaming != null && message.hasOwnProperty("serverStreaming"))
                        object.serverStreaming = message.serverStreaming;
                    return object;
                };
    
                /**
                 * Converts this MethodDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MethodDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for MethodDescriptorProto
                 * @function getTypeUrl
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                MethodDescriptorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.MethodDescriptorProto";
                };
    
                return MethodDescriptorProto;
            })();
    
            protobuf.FileOptions = (function() {
    
                /**
                 * Properties of a FileOptions.
                 * @memberof google.protobuf
                 * @interface IFileOptions
                 * @property {string|null} [javaPackage] FileOptions javaPackage
                 * @property {string|null} [javaOuterClassname] FileOptions javaOuterClassname
                 * @property {boolean|null} [javaMultipleFiles] FileOptions javaMultipleFiles
                 * @property {boolean|null} [javaGenerateEqualsAndHash] FileOptions javaGenerateEqualsAndHash
                 * @property {boolean|null} [javaStringCheckUtf8] FileOptions javaStringCheckUtf8
                 * @property {google.protobuf.FileOptions.OptimizeMode|null} [optimizeFor] FileOptions optimizeFor
                 * @property {string|null} [goPackage] FileOptions goPackage
                 * @property {boolean|null} [ccGenericServices] FileOptions ccGenericServices
                 * @property {boolean|null} [javaGenericServices] FileOptions javaGenericServices
                 * @property {boolean|null} [pyGenericServices] FileOptions pyGenericServices
                 * @property {boolean|null} [deprecated] FileOptions deprecated
                 * @property {boolean|null} [ccEnableArenas] FileOptions ccEnableArenas
                 * @property {string|null} [objcClassPrefix] FileOptions objcClassPrefix
                 * @property {string|null} [csharpNamespace] FileOptions csharpNamespace
                 * @property {string|null} [swiftPrefix] FileOptions swiftPrefix
                 * @property {string|null} [phpClassPrefix] FileOptions phpClassPrefix
                 * @property {string|null} [phpNamespace] FileOptions phpNamespace
                 * @property {string|null} [phpMetadataNamespace] FileOptions phpMetadataNamespace
                 * @property {string|null} [rubyPackage] FileOptions rubyPackage
                 * @property {google.protobuf.IFeatureSet|null} [features] FileOptions features
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] FileOptions uninterpretedOption
                 * @property {Array.<google.api.IResourceDescriptor>|null} [".google.api.resourceDefinition"] FileOptions .google.api.resourceDefinition
                 */
    
                /**
                 * Constructs a new FileOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileOptions.
                 * @implements IFileOptions
                 * @constructor
                 * @param {google.protobuf.IFileOptions=} [properties] Properties to set
                 */
                function FileOptions(properties) {
                    this.uninterpretedOption = [];
                    this[".google.api.resourceDefinition"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileOptions javaPackage.
                 * @member {string} javaPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaPackage = "";
    
                /**
                 * FileOptions javaOuterClassname.
                 * @member {string} javaOuterClassname
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaOuterClassname = "";
    
                /**
                 * FileOptions javaMultipleFiles.
                 * @member {boolean} javaMultipleFiles
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaMultipleFiles = false;
    
                /**
                 * FileOptions javaGenerateEqualsAndHash.
                 * @member {boolean} javaGenerateEqualsAndHash
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaGenerateEqualsAndHash = false;
    
                /**
                 * FileOptions javaStringCheckUtf8.
                 * @member {boolean} javaStringCheckUtf8
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaStringCheckUtf8 = false;
    
                /**
                 * FileOptions optimizeFor.
                 * @member {google.protobuf.FileOptions.OptimizeMode} optimizeFor
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.optimizeFor = 1;
    
                /**
                 * FileOptions goPackage.
                 * @member {string} goPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.goPackage = "";
    
                /**
                 * FileOptions ccGenericServices.
                 * @member {boolean} ccGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.ccGenericServices = false;
    
                /**
                 * FileOptions javaGenericServices.
                 * @member {boolean} javaGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaGenericServices = false;
    
                /**
                 * FileOptions pyGenericServices.
                 * @member {boolean} pyGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.pyGenericServices = false;
    
                /**
                 * FileOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.deprecated = false;
    
                /**
                 * FileOptions ccEnableArenas.
                 * @member {boolean} ccEnableArenas
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.ccEnableArenas = true;
    
                /**
                 * FileOptions objcClassPrefix.
                 * @member {string} objcClassPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.objcClassPrefix = "";
    
                /**
                 * FileOptions csharpNamespace.
                 * @member {string} csharpNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.csharpNamespace = "";
    
                /**
                 * FileOptions swiftPrefix.
                 * @member {string} swiftPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.swiftPrefix = "";
    
                /**
                 * FileOptions phpClassPrefix.
                 * @member {string} phpClassPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpClassPrefix = "";
    
                /**
                 * FileOptions phpNamespace.
                 * @member {string} phpNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpNamespace = "";
    
                /**
                 * FileOptions phpMetadataNamespace.
                 * @member {string} phpMetadataNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpMetadataNamespace = "";
    
                /**
                 * FileOptions rubyPackage.
                 * @member {string} rubyPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.rubyPackage = "";
    
                /**
                 * FileOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.features = null;
    
                /**
                 * FileOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * FileOptions .google.api.resourceDefinition.
                 * @member {Array.<google.api.IResourceDescriptor>} .google.api.resourceDefinition
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype[".google.api.resourceDefinition"] = $util.emptyArray;
    
                /**
                 * Creates a new FileOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions=} [properties] Properties to set
                 * @returns {google.protobuf.FileOptions} FileOptions instance
                 */
                FileOptions.create = function create(properties) {
                    return new FileOptions(properties);
                };
    
                /**
                 * Encodes the specified FileOptions message. Does not implicitly {@link google.protobuf.FileOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions} message FileOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.javaPackage != null && Object.hasOwnProperty.call(message, "javaPackage"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.javaPackage);
                    if (message.javaOuterClassname != null && Object.hasOwnProperty.call(message, "javaOuterClassname"))
                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.javaOuterClassname);
                    if (message.optimizeFor != null && Object.hasOwnProperty.call(message, "optimizeFor"))
                        writer.uint32(/* id 9, wireType 0 =*/72).int32(message.optimizeFor);
                    if (message.javaMultipleFiles != null && Object.hasOwnProperty.call(message, "javaMultipleFiles"))
                        writer.uint32(/* id 10, wireType 0 =*/80).bool(message.javaMultipleFiles);
                    if (message.goPackage != null && Object.hasOwnProperty.call(message, "goPackage"))
                        writer.uint32(/* id 11, wireType 2 =*/90).string(message.goPackage);
                    if (message.ccGenericServices != null && Object.hasOwnProperty.call(message, "ccGenericServices"))
                        writer.uint32(/* id 16, wireType 0 =*/128).bool(message.ccGenericServices);
                    if (message.javaGenericServices != null && Object.hasOwnProperty.call(message, "javaGenericServices"))
                        writer.uint32(/* id 17, wireType 0 =*/136).bool(message.javaGenericServices);
                    if (message.pyGenericServices != null && Object.hasOwnProperty.call(message, "pyGenericServices"))
                        writer.uint32(/* id 18, wireType 0 =*/144).bool(message.pyGenericServices);
                    if (message.javaGenerateEqualsAndHash != null && Object.hasOwnProperty.call(message, "javaGenerateEqualsAndHash"))
                        writer.uint32(/* id 20, wireType 0 =*/160).bool(message.javaGenerateEqualsAndHash);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 23, wireType 0 =*/184).bool(message.deprecated);
                    if (message.javaStringCheckUtf8 != null && Object.hasOwnProperty.call(message, "javaStringCheckUtf8"))
                        writer.uint32(/* id 27, wireType 0 =*/216).bool(message.javaStringCheckUtf8);
                    if (message.ccEnableArenas != null && Object.hasOwnProperty.call(message, "ccEnableArenas"))
                        writer.uint32(/* id 31, wireType 0 =*/248).bool(message.ccEnableArenas);
                    if (message.objcClassPrefix != null && Object.hasOwnProperty.call(message, "objcClassPrefix"))
                        writer.uint32(/* id 36, wireType 2 =*/290).string(message.objcClassPrefix);
                    if (message.csharpNamespace != null && Object.hasOwnProperty.call(message, "csharpNamespace"))
                        writer.uint32(/* id 37, wireType 2 =*/298).string(message.csharpNamespace);
                    if (message.swiftPrefix != null && Object.hasOwnProperty.call(message, "swiftPrefix"))
                        writer.uint32(/* id 39, wireType 2 =*/314).string(message.swiftPrefix);
                    if (message.phpClassPrefix != null && Object.hasOwnProperty.call(message, "phpClassPrefix"))
                        writer.uint32(/* id 40, wireType 2 =*/322).string(message.phpClassPrefix);
                    if (message.phpNamespace != null && Object.hasOwnProperty.call(message, "phpNamespace"))
                        writer.uint32(/* id 41, wireType 2 =*/330).string(message.phpNamespace);
                    if (message.phpMetadataNamespace != null && Object.hasOwnProperty.call(message, "phpMetadataNamespace"))
                        writer.uint32(/* id 44, wireType 2 =*/354).string(message.phpMetadataNamespace);
                    if (message.rubyPackage != null && Object.hasOwnProperty.call(message, "rubyPackage"))
                        writer.uint32(/* id 45, wireType 2 =*/362).string(message.rubyPackage);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 50, wireType 2 =*/402).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.resourceDefinition"] != null && message[".google.api.resourceDefinition"].length)
                        for (var i = 0; i < message[".google.api.resourceDefinition"].length; ++i)
                            $root.google.api.ResourceDescriptor.encode(message[".google.api.resourceDefinition"][i], writer.uint32(/* id 1053, wireType 2 =*/8426).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FileOptions message, length delimited. Does not implicitly {@link google.protobuf.FileOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions} message FileOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileOptions} FileOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.javaPackage = reader.string();
                                break;
                            }
                        case 8: {
                                message.javaOuterClassname = reader.string();
                                break;
                            }
                        case 10: {
                                message.javaMultipleFiles = reader.bool();
                                break;
                            }
                        case 20: {
                                message.javaGenerateEqualsAndHash = reader.bool();
                                break;
                            }
                        case 27: {
                                message.javaStringCheckUtf8 = reader.bool();
                                break;
                            }
                        case 9: {
                                message.optimizeFor = reader.int32();
                                break;
                            }
                        case 11: {
                                message.goPackage = reader.string();
                                break;
                            }
                        case 16: {
                                message.ccGenericServices = reader.bool();
                                break;
                            }
                        case 17: {
                                message.javaGenericServices = reader.bool();
                                break;
                            }
                        case 18: {
                                message.pyGenericServices = reader.bool();
                                break;
                            }
                        case 23: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 31: {
                                message.ccEnableArenas = reader.bool();
                                break;
                            }
                        case 36: {
                                message.objcClassPrefix = reader.string();
                                break;
                            }
                        case 37: {
                                message.csharpNamespace = reader.string();
                                break;
                            }
                        case 39: {
                                message.swiftPrefix = reader.string();
                                break;
                            }
                        case 40: {
                                message.phpClassPrefix = reader.string();
                                break;
                            }
                        case 41: {
                                message.phpNamespace = reader.string();
                                break;
                            }
                        case 44: {
                                message.phpMetadataNamespace = reader.string();
                                break;
                            }
                        case 45: {
                                message.rubyPackage = reader.string();
                                break;
                            }
                        case 50: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 1053: {
                                if (!(message[".google.api.resourceDefinition"] && message[".google.api.resourceDefinition"].length))
                                    message[".google.api.resourceDefinition"] = [];
                                message[".google.api.resourceDefinition"].push($root.google.api.ResourceDescriptor.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileOptions} FileOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileOptions message.
                 * @function verify
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.javaPackage != null && message.hasOwnProperty("javaPackage"))
                        if (!$util.isString(message.javaPackage))
                            return "javaPackage: string expected";
                    if (message.javaOuterClassname != null && message.hasOwnProperty("javaOuterClassname"))
                        if (!$util.isString(message.javaOuterClassname))
                            return "javaOuterClassname: string expected";
                    if (message.javaMultipleFiles != null && message.hasOwnProperty("javaMultipleFiles"))
                        if (typeof message.javaMultipleFiles !== "boolean")
                            return "javaMultipleFiles: boolean expected";
                    if (message.javaGenerateEqualsAndHash != null && message.hasOwnProperty("javaGenerateEqualsAndHash"))
                        if (typeof message.javaGenerateEqualsAndHash !== "boolean")
                            return "javaGenerateEqualsAndHash: boolean expected";
                    if (message.javaStringCheckUtf8 != null && message.hasOwnProperty("javaStringCheckUtf8"))
                        if (typeof message.javaStringCheckUtf8 !== "boolean")
                            return "javaStringCheckUtf8: boolean expected";
                    if (message.optimizeFor != null && message.hasOwnProperty("optimizeFor"))
                        switch (message.optimizeFor) {
                        default:
                            return "optimizeFor: enum value expected";
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.goPackage != null && message.hasOwnProperty("goPackage"))
                        if (!$util.isString(message.goPackage))
                            return "goPackage: string expected";
                    if (message.ccGenericServices != null && message.hasOwnProperty("ccGenericServices"))
                        if (typeof message.ccGenericServices !== "boolean")
                            return "ccGenericServices: boolean expected";
                    if (message.javaGenericServices != null && message.hasOwnProperty("javaGenericServices"))
                        if (typeof message.javaGenericServices !== "boolean")
                            return "javaGenericServices: boolean expected";
                    if (message.pyGenericServices != null && message.hasOwnProperty("pyGenericServices"))
                        if (typeof message.pyGenericServices !== "boolean")
                            return "pyGenericServices: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.ccEnableArenas != null && message.hasOwnProperty("ccEnableArenas"))
                        if (typeof message.ccEnableArenas !== "boolean")
                            return "ccEnableArenas: boolean expected";
                    if (message.objcClassPrefix != null && message.hasOwnProperty("objcClassPrefix"))
                        if (!$util.isString(message.objcClassPrefix))
                            return "objcClassPrefix: string expected";
                    if (message.csharpNamespace != null && message.hasOwnProperty("csharpNamespace"))
                        if (!$util.isString(message.csharpNamespace))
                            return "csharpNamespace: string expected";
                    if (message.swiftPrefix != null && message.hasOwnProperty("swiftPrefix"))
                        if (!$util.isString(message.swiftPrefix))
                            return "swiftPrefix: string expected";
                    if (message.phpClassPrefix != null && message.hasOwnProperty("phpClassPrefix"))
                        if (!$util.isString(message.phpClassPrefix))
                            return "phpClassPrefix: string expected";
                    if (message.phpNamespace != null && message.hasOwnProperty("phpNamespace"))
                        if (!$util.isString(message.phpNamespace))
                            return "phpNamespace: string expected";
                    if (message.phpMetadataNamespace != null && message.hasOwnProperty("phpMetadataNamespace"))
                        if (!$util.isString(message.phpMetadataNamespace))
                            return "phpMetadataNamespace: string expected";
                    if (message.rubyPackage != null && message.hasOwnProperty("rubyPackage"))
                        if (!$util.isString(message.rubyPackage))
                            return "rubyPackage: string expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.resourceDefinition"] != null && message.hasOwnProperty(".google.api.resourceDefinition")) {
                        if (!Array.isArray(message[".google.api.resourceDefinition"]))
                            return ".google.api.resourceDefinition: array expected";
                        for (var i = 0; i < message[".google.api.resourceDefinition"].length; ++i) {
                            var error = $root.google.api.ResourceDescriptor.verify(message[".google.api.resourceDefinition"][i]);
                            if (error)
                                return ".google.api.resourceDefinition." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a FileOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileOptions} FileOptions
                 */
                FileOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileOptions)
                        return object;
                    var message = new $root.google.protobuf.FileOptions();
                    if (object.javaPackage != null)
                        message.javaPackage = String(object.javaPackage);
                    if (object.javaOuterClassname != null)
                        message.javaOuterClassname = String(object.javaOuterClassname);
                    if (object.javaMultipleFiles != null)
                        message.javaMultipleFiles = Boolean(object.javaMultipleFiles);
                    if (object.javaGenerateEqualsAndHash != null)
                        message.javaGenerateEqualsAndHash = Boolean(object.javaGenerateEqualsAndHash);
                    if (object.javaStringCheckUtf8 != null)
                        message.javaStringCheckUtf8 = Boolean(object.javaStringCheckUtf8);
                    switch (object.optimizeFor) {
                    default:
                        if (typeof object.optimizeFor === "number") {
                            message.optimizeFor = object.optimizeFor;
                            break;
                        }
                        break;
                    case "SPEED":
                    case 1:
                        message.optimizeFor = 1;
                        break;
                    case "CODE_SIZE":
                    case 2:
                        message.optimizeFor = 2;
                        break;
                    case "LITE_RUNTIME":
                    case 3:
                        message.optimizeFor = 3;
                        break;
                    }
                    if (object.goPackage != null)
                        message.goPackage = String(object.goPackage);
                    if (object.ccGenericServices != null)
                        message.ccGenericServices = Boolean(object.ccGenericServices);
                    if (object.javaGenericServices != null)
                        message.javaGenericServices = Boolean(object.javaGenericServices);
                    if (object.pyGenericServices != null)
                        message.pyGenericServices = Boolean(object.pyGenericServices);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.ccEnableArenas != null)
                        message.ccEnableArenas = Boolean(object.ccEnableArenas);
                    if (object.objcClassPrefix != null)
                        message.objcClassPrefix = String(object.objcClassPrefix);
                    if (object.csharpNamespace != null)
                        message.csharpNamespace = String(object.csharpNamespace);
                    if (object.swiftPrefix != null)
                        message.swiftPrefix = String(object.swiftPrefix);
                    if (object.phpClassPrefix != null)
                        message.phpClassPrefix = String(object.phpClassPrefix);
                    if (object.phpNamespace != null)
                        message.phpNamespace = String(object.phpNamespace);
                    if (object.phpMetadataNamespace != null)
                        message.phpMetadataNamespace = String(object.phpMetadataNamespace);
                    if (object.rubyPackage != null)
                        message.rubyPackage = String(object.rubyPackage);
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.FileOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.FileOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.FileOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.resourceDefinition"]) {
                        if (!Array.isArray(object[".google.api.resourceDefinition"]))
                            throw TypeError(".google.protobuf.FileOptions..google.api.resourceDefinition: array expected");
                        message[".google.api.resourceDefinition"] = [];
                        for (var i = 0; i < object[".google.api.resourceDefinition"].length; ++i) {
                            if (typeof object[".google.api.resourceDefinition"][i] !== "object")
                                throw TypeError(".google.protobuf.FileOptions..google.api.resourceDefinition: object expected");
                            message[".google.api.resourceDefinition"][i] = $root.google.api.ResourceDescriptor.fromObject(object[".google.api.resourceDefinition"][i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.FileOptions} message FileOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.uninterpretedOption = [];
                        object[".google.api.resourceDefinition"] = [];
                    }
                    if (options.defaults) {
                        object.javaPackage = "";
                        object.javaOuterClassname = "";
                        object.optimizeFor = options.enums === String ? "SPEED" : 1;
                        object.javaMultipleFiles = false;
                        object.goPackage = "";
                        object.ccGenericServices = false;
                        object.javaGenericServices = false;
                        object.pyGenericServices = false;
                        object.javaGenerateEqualsAndHash = false;
                        object.deprecated = false;
                        object.javaStringCheckUtf8 = false;
                        object.ccEnableArenas = true;
                        object.objcClassPrefix = "";
                        object.csharpNamespace = "";
                        object.swiftPrefix = "";
                        object.phpClassPrefix = "";
                        object.phpNamespace = "";
                        object.phpMetadataNamespace = "";
                        object.rubyPackage = "";
                        object.features = null;
                    }
                    if (message.javaPackage != null && message.hasOwnProperty("javaPackage"))
                        object.javaPackage = message.javaPackage;
                    if (message.javaOuterClassname != null && message.hasOwnProperty("javaOuterClassname"))
                        object.javaOuterClassname = message.javaOuterClassname;
                    if (message.optimizeFor != null && message.hasOwnProperty("optimizeFor"))
                        object.optimizeFor = options.enums === String ? $root.google.protobuf.FileOptions.OptimizeMode[message.optimizeFor] === undefined ? message.optimizeFor : $root.google.protobuf.FileOptions.OptimizeMode[message.optimizeFor] : message.optimizeFor;
                    if (message.javaMultipleFiles != null && message.hasOwnProperty("javaMultipleFiles"))
                        object.javaMultipleFiles = message.javaMultipleFiles;
                    if (message.goPackage != null && message.hasOwnProperty("goPackage"))
                        object.goPackage = message.goPackage;
                    if (message.ccGenericServices != null && message.hasOwnProperty("ccGenericServices"))
                        object.ccGenericServices = message.ccGenericServices;
                    if (message.javaGenericServices != null && message.hasOwnProperty("javaGenericServices"))
                        object.javaGenericServices = message.javaGenericServices;
                    if (message.pyGenericServices != null && message.hasOwnProperty("pyGenericServices"))
                        object.pyGenericServices = message.pyGenericServices;
                    if (message.javaGenerateEqualsAndHash != null && message.hasOwnProperty("javaGenerateEqualsAndHash"))
                        object.javaGenerateEqualsAndHash = message.javaGenerateEqualsAndHash;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.javaStringCheckUtf8 != null && message.hasOwnProperty("javaStringCheckUtf8"))
                        object.javaStringCheckUtf8 = message.javaStringCheckUtf8;
                    if (message.ccEnableArenas != null && message.hasOwnProperty("ccEnableArenas"))
                        object.ccEnableArenas = message.ccEnableArenas;
                    if (message.objcClassPrefix != null && message.hasOwnProperty("objcClassPrefix"))
                        object.objcClassPrefix = message.objcClassPrefix;
                    if (message.csharpNamespace != null && message.hasOwnProperty("csharpNamespace"))
                        object.csharpNamespace = message.csharpNamespace;
                    if (message.swiftPrefix != null && message.hasOwnProperty("swiftPrefix"))
                        object.swiftPrefix = message.swiftPrefix;
                    if (message.phpClassPrefix != null && message.hasOwnProperty("phpClassPrefix"))
                        object.phpClassPrefix = message.phpClassPrefix;
                    if (message.phpNamespace != null && message.hasOwnProperty("phpNamespace"))
                        object.phpNamespace = message.phpNamespace;
                    if (message.phpMetadataNamespace != null && message.hasOwnProperty("phpMetadataNamespace"))
                        object.phpMetadataNamespace = message.phpMetadataNamespace;
                    if (message.rubyPackage != null && message.hasOwnProperty("rubyPackage"))
                        object.rubyPackage = message.rubyPackage;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.resourceDefinition"] && message[".google.api.resourceDefinition"].length) {
                        object[".google.api.resourceDefinition"] = [];
                        for (var j = 0; j < message[".google.api.resourceDefinition"].length; ++j)
                            object[".google.api.resourceDefinition"][j] = $root.google.api.ResourceDescriptor.toObject(message[".google.api.resourceDefinition"][j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this FileOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FileOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FileOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FileOptions";
                };
    
                /**
                 * OptimizeMode enum.
                 * @name google.protobuf.FileOptions.OptimizeMode
                 * @enum {number}
                 * @property {number} SPEED=1 SPEED value
                 * @property {number} CODE_SIZE=2 CODE_SIZE value
                 * @property {number} LITE_RUNTIME=3 LITE_RUNTIME value
                 */
                FileOptions.OptimizeMode = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "SPEED"] = 1;
                    values[valuesById[2] = "CODE_SIZE"] = 2;
                    values[valuesById[3] = "LITE_RUNTIME"] = 3;
                    return values;
                })();
    
                return FileOptions;
            })();
    
            protobuf.MessageOptions = (function() {
    
                /**
                 * Properties of a MessageOptions.
                 * @memberof google.protobuf
                 * @interface IMessageOptions
                 * @property {boolean|null} [messageSetWireFormat] MessageOptions messageSetWireFormat
                 * @property {boolean|null} [noStandardDescriptorAccessor] MessageOptions noStandardDescriptorAccessor
                 * @property {boolean|null} [deprecated] MessageOptions deprecated
                 * @property {boolean|null} [mapEntry] MessageOptions mapEntry
                 * @property {boolean|null} [deprecatedLegacyJsonFieldConflicts] MessageOptions deprecatedLegacyJsonFieldConflicts
                 * @property {google.protobuf.IFeatureSet|null} [features] MessageOptions features
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] MessageOptions uninterpretedOption
                 * @property {google.api.IResourceDescriptor|null} [".google.api.resource"] MessageOptions .google.api.resource
                 */
    
                /**
                 * Constructs a new MessageOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a MessageOptions.
                 * @implements IMessageOptions
                 * @constructor
                 * @param {google.protobuf.IMessageOptions=} [properties] Properties to set
                 */
                function MessageOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MessageOptions messageSetWireFormat.
                 * @member {boolean} messageSetWireFormat
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.messageSetWireFormat = false;
    
                /**
                 * MessageOptions noStandardDescriptorAccessor.
                 * @member {boolean} noStandardDescriptorAccessor
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.noStandardDescriptorAccessor = false;
    
                /**
                 * MessageOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.deprecated = false;
    
                /**
                 * MessageOptions mapEntry.
                 * @member {boolean} mapEntry
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.mapEntry = false;
    
                /**
                 * MessageOptions deprecatedLegacyJsonFieldConflicts.
                 * @member {boolean} deprecatedLegacyJsonFieldConflicts
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.deprecatedLegacyJsonFieldConflicts = false;
    
                /**
                 * MessageOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.features = null;
    
                /**
                 * MessageOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * MessageOptions .google.api.resource.
                 * @member {google.api.IResourceDescriptor|null|undefined} .google.api.resource
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype[".google.api.resource"] = null;
    
                /**
                 * Creates a new MessageOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions=} [properties] Properties to set
                 * @returns {google.protobuf.MessageOptions} MessageOptions instance
                 */
                MessageOptions.create = function create(properties) {
                    return new MessageOptions(properties);
                };
    
                /**
                 * Encodes the specified MessageOptions message. Does not implicitly {@link google.protobuf.MessageOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions} message MessageOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MessageOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.messageSetWireFormat != null && Object.hasOwnProperty.call(message, "messageSetWireFormat"))
                        writer.uint32(/* id 1, wireType 0 =*/8).bool(message.messageSetWireFormat);
                    if (message.noStandardDescriptorAccessor != null && Object.hasOwnProperty.call(message, "noStandardDescriptorAccessor"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.noStandardDescriptorAccessor);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.mapEntry != null && Object.hasOwnProperty.call(message, "mapEntry"))
                        writer.uint32(/* id 7, wireType 0 =*/56).bool(message.mapEntry);
                    if (message.deprecatedLegacyJsonFieldConflicts != null && Object.hasOwnProperty.call(message, "deprecatedLegacyJsonFieldConflicts"))
                        writer.uint32(/* id 11, wireType 0 =*/88).bool(message.deprecatedLegacyJsonFieldConflicts);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.resource"] != null && Object.hasOwnProperty.call(message, ".google.api.resource"))
                        $root.google.api.ResourceDescriptor.encode(message[".google.api.resource"], writer.uint32(/* id 1053, wireType 2 =*/8426).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MessageOptions message, length delimited. Does not implicitly {@link google.protobuf.MessageOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions} message MessageOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MessageOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MessageOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MessageOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MessageOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.messageSetWireFormat = reader.bool();
                                break;
                            }
                        case 2: {
                                message.noStandardDescriptorAccessor = reader.bool();
                                break;
                            }
                        case 3: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 7: {
                                message.mapEntry = reader.bool();
                                break;
                            }
                        case 11: {
                                message.deprecatedLegacyJsonFieldConflicts = reader.bool();
                                break;
                            }
                        case 12: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 1053: {
                                message[".google.api.resource"] = $root.google.api.ResourceDescriptor.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MessageOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MessageOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MessageOptions message.
                 * @function verify
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MessageOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.messageSetWireFormat != null && message.hasOwnProperty("messageSetWireFormat"))
                        if (typeof message.messageSetWireFormat !== "boolean")
                            return "messageSetWireFormat: boolean expected";
                    if (message.noStandardDescriptorAccessor != null && message.hasOwnProperty("noStandardDescriptorAccessor"))
                        if (typeof message.noStandardDescriptorAccessor !== "boolean")
                            return "noStandardDescriptorAccessor: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.mapEntry != null && message.hasOwnProperty("mapEntry"))
                        if (typeof message.mapEntry !== "boolean")
                            return "mapEntry: boolean expected";
                    if (message.deprecatedLegacyJsonFieldConflicts != null && message.hasOwnProperty("deprecatedLegacyJsonFieldConflicts"))
                        if (typeof message.deprecatedLegacyJsonFieldConflicts !== "boolean")
                            return "deprecatedLegacyJsonFieldConflicts: boolean expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.resource"] != null && message.hasOwnProperty(".google.api.resource")) {
                        var error = $root.google.api.ResourceDescriptor.verify(message[".google.api.resource"]);
                        if (error)
                            return ".google.api.resource." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a MessageOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 */
                MessageOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MessageOptions)
                        return object;
                    var message = new $root.google.protobuf.MessageOptions();
                    if (object.messageSetWireFormat != null)
                        message.messageSetWireFormat = Boolean(object.messageSetWireFormat);
                    if (object.noStandardDescriptorAccessor != null)
                        message.noStandardDescriptorAccessor = Boolean(object.noStandardDescriptorAccessor);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.mapEntry != null)
                        message.mapEntry = Boolean(object.mapEntry);
                    if (object.deprecatedLegacyJsonFieldConflicts != null)
                        message.deprecatedLegacyJsonFieldConflicts = Boolean(object.deprecatedLegacyJsonFieldConflicts);
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.MessageOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.MessageOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.MessageOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.resource"] != null) {
                        if (typeof object[".google.api.resource"] !== "object")
                            throw TypeError(".google.protobuf.MessageOptions..google.api.resource: object expected");
                        message[".google.api.resource"] = $root.google.api.ResourceDescriptor.fromObject(object[".google.api.resource"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MessageOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.MessageOptions} message MessageOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MessageOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.messageSetWireFormat = false;
                        object.noStandardDescriptorAccessor = false;
                        object.deprecated = false;
                        object.mapEntry = false;
                        object.deprecatedLegacyJsonFieldConflicts = false;
                        object.features = null;
                        object[".google.api.resource"] = null;
                    }
                    if (message.messageSetWireFormat != null && message.hasOwnProperty("messageSetWireFormat"))
                        object.messageSetWireFormat = message.messageSetWireFormat;
                    if (message.noStandardDescriptorAccessor != null && message.hasOwnProperty("noStandardDescriptorAccessor"))
                        object.noStandardDescriptorAccessor = message.noStandardDescriptorAccessor;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.mapEntry != null && message.hasOwnProperty("mapEntry"))
                        object.mapEntry = message.mapEntry;
                    if (message.deprecatedLegacyJsonFieldConflicts != null && message.hasOwnProperty("deprecatedLegacyJsonFieldConflicts"))
                        object.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.resource"] != null && message.hasOwnProperty(".google.api.resource"))
                        object[".google.api.resource"] = $root.google.api.ResourceDescriptor.toObject(message[".google.api.resource"], options);
                    return object;
                };
    
                /**
                 * Converts this MessageOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MessageOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for MessageOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                MessageOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.MessageOptions";
                };
    
                return MessageOptions;
            })();
    
            protobuf.FieldOptions = (function() {
    
                /**
                 * Properties of a FieldOptions.
                 * @memberof google.protobuf
                 * @interface IFieldOptions
                 * @property {google.protobuf.FieldOptions.CType|null} [ctype] FieldOptions ctype
                 * @property {boolean|null} [packed] FieldOptions packed
                 * @property {google.protobuf.FieldOptions.JSType|null} [jstype] FieldOptions jstype
                 * @property {boolean|null} [lazy] FieldOptions lazy
                 * @property {boolean|null} [unverifiedLazy] FieldOptions unverifiedLazy
                 * @property {boolean|null} [deprecated] FieldOptions deprecated
                 * @property {boolean|null} [weak] FieldOptions weak
                 * @property {boolean|null} [debugRedact] FieldOptions debugRedact
                 * @property {google.protobuf.FieldOptions.OptionRetention|null} [retention] FieldOptions retention
                 * @property {Array.<google.protobuf.FieldOptions.OptionTargetType>|null} [targets] FieldOptions targets
                 * @property {Array.<google.protobuf.FieldOptions.IEditionDefault>|null} [editionDefaults] FieldOptions editionDefaults
                 * @property {google.protobuf.IFeatureSet|null} [features] FieldOptions features
                 * @property {google.protobuf.FieldOptions.IFeatureSupport|null} [featureSupport] FieldOptions featureSupport
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] FieldOptions uninterpretedOption
                 * @property {Array.<google.api.FieldBehavior>|null} [".google.api.fieldBehavior"] FieldOptions .google.api.fieldBehavior
                 * @property {google.api.IResourceReference|null} [".google.api.resourceReference"] FieldOptions .google.api.resourceReference
                 */
    
                /**
                 * Constructs a new FieldOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldOptions.
                 * @implements IFieldOptions
                 * @constructor
                 * @param {google.protobuf.IFieldOptions=} [properties] Properties to set
                 */
                function FieldOptions(properties) {
                    this.targets = [];
                    this.editionDefaults = [];
                    this.uninterpretedOption = [];
                    this[".google.api.fieldBehavior"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldOptions ctype.
                 * @member {google.protobuf.FieldOptions.CType} ctype
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.ctype = 0;
    
                /**
                 * FieldOptions packed.
                 * @member {boolean} packed
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.packed = false;
    
                /**
                 * FieldOptions jstype.
                 * @member {google.protobuf.FieldOptions.JSType} jstype
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.jstype = 0;
    
                /**
                 * FieldOptions lazy.
                 * @member {boolean} lazy
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.lazy = false;
    
                /**
                 * FieldOptions unverifiedLazy.
                 * @member {boolean} unverifiedLazy
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.unverifiedLazy = false;
    
                /**
                 * FieldOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.deprecated = false;
    
                /**
                 * FieldOptions weak.
                 * @member {boolean} weak
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.weak = false;
    
                /**
                 * FieldOptions debugRedact.
                 * @member {boolean} debugRedact
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.debugRedact = false;
    
                /**
                 * FieldOptions retention.
                 * @member {google.protobuf.FieldOptions.OptionRetention} retention
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.retention = 0;
    
                /**
                 * FieldOptions targets.
                 * @member {Array.<google.protobuf.FieldOptions.OptionTargetType>} targets
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.targets = $util.emptyArray;
    
                /**
                 * FieldOptions editionDefaults.
                 * @member {Array.<google.protobuf.FieldOptions.IEditionDefault>} editionDefaults
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.editionDefaults = $util.emptyArray;
    
                /**
                 * FieldOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.features = null;
    
                /**
                 * FieldOptions featureSupport.
                 * @member {google.protobuf.FieldOptions.IFeatureSupport|null|undefined} featureSupport
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.featureSupport = null;
    
                /**
                 * FieldOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * FieldOptions .google.api.fieldBehavior.
                 * @member {Array.<google.api.FieldBehavior>} .google.api.fieldBehavior
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype[".google.api.fieldBehavior"] = $util.emptyArray;
    
                /**
                 * FieldOptions .google.api.resourceReference.
                 * @member {google.api.IResourceReference|null|undefined} .google.api.resourceReference
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype[".google.api.resourceReference"] = null;
    
                /**
                 * Creates a new FieldOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions=} [properties] Properties to set
                 * @returns {google.protobuf.FieldOptions} FieldOptions instance
                 */
                FieldOptions.create = function create(properties) {
                    return new FieldOptions(properties);
                };
    
                /**
                 * Encodes the specified FieldOptions message. Does not implicitly {@link google.protobuf.FieldOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions} message FieldOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.ctype != null && Object.hasOwnProperty.call(message, "ctype"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ctype);
                    if (message.packed != null && Object.hasOwnProperty.call(message, "packed"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.packed);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.lazy != null && Object.hasOwnProperty.call(message, "lazy"))
                        writer.uint32(/* id 5, wireType 0 =*/40).bool(message.lazy);
                    if (message.jstype != null && Object.hasOwnProperty.call(message, "jstype"))
                        writer.uint32(/* id 6, wireType 0 =*/48).int32(message.jstype);
                    if (message.weak != null && Object.hasOwnProperty.call(message, "weak"))
                        writer.uint32(/* id 10, wireType 0 =*/80).bool(message.weak);
                    if (message.unverifiedLazy != null && Object.hasOwnProperty.call(message, "unverifiedLazy"))
                        writer.uint32(/* id 15, wireType 0 =*/120).bool(message.unverifiedLazy);
                    if (message.debugRedact != null && Object.hasOwnProperty.call(message, "debugRedact"))
                        writer.uint32(/* id 16, wireType 0 =*/128).bool(message.debugRedact);
                    if (message.retention != null && Object.hasOwnProperty.call(message, "retention"))
                        writer.uint32(/* id 17, wireType 0 =*/136).int32(message.retention);
                    if (message.targets != null && message.targets.length)
                        for (var i = 0; i < message.targets.length; ++i)
                            writer.uint32(/* id 19, wireType 0 =*/152).int32(message.targets[i]);
                    if (message.editionDefaults != null && message.editionDefaults.length)
                        for (var i = 0; i < message.editionDefaults.length; ++i)
                            $root.google.protobuf.FieldOptions.EditionDefault.encode(message.editionDefaults[i], writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim();
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim();
                    if (message.featureSupport != null && Object.hasOwnProperty.call(message, "featureSupport"))
                        $root.google.protobuf.FieldOptions.FeatureSupport.encode(message.featureSupport, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.fieldBehavior"] != null && message[".google.api.fieldBehavior"].length)
                        for (var i = 0; i < message[".google.api.fieldBehavior"].length; ++i)
                            writer.uint32(/* id 1052, wireType 0 =*/8416).int32(message[".google.api.fieldBehavior"][i]);
                    if (message[".google.api.resourceReference"] != null && Object.hasOwnProperty.call(message, ".google.api.resourceReference"))
                        $root.google.api.ResourceReference.encode(message[".google.api.resourceReference"], writer.uint32(/* id 1055, wireType 2 =*/8442).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldOptions message, length delimited. Does not implicitly {@link google.protobuf.FieldOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions} message FieldOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.ctype = reader.int32();
                                break;
                            }
                        case 2: {
                                message.packed = reader.bool();
                                break;
                            }
                        case 6: {
                                message.jstype = reader.int32();
                                break;
                            }
                        case 5: {
                                message.lazy = reader.bool();
                                break;
                            }
                        case 15: {
                                message.unverifiedLazy = reader.bool();
                                break;
                            }
                        case 3: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 10: {
                                message.weak = reader.bool();
                                break;
                            }
                        case 16: {
                                message.debugRedact = reader.bool();
                                break;
                            }
                        case 17: {
                                message.retention = reader.int32();
                                break;
                            }
                        case 19: {
                                if (!(message.targets && message.targets.length))
                                    message.targets = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.targets.push(reader.int32());
                                } else
                                    message.targets.push(reader.int32());
                                break;
                            }
                        case 20: {
                                if (!(message.editionDefaults && message.editionDefaults.length))
                                    message.editionDefaults = [];
                                message.editionDefaults.push($root.google.protobuf.FieldOptions.EditionDefault.decode(reader, reader.uint32()));
                                break;
                            }
                        case 21: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 22: {
                                message.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 1052: {
                                if (!(message[".google.api.fieldBehavior"] && message[".google.api.fieldBehavior"].length))
                                    message[".google.api.fieldBehavior"] = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message[".google.api.fieldBehavior"].push(reader.int32());
                                } else
                                    message[".google.api.fieldBehavior"].push(reader.int32());
                                break;
                            }
                        case 1055: {
                                message[".google.api.resourceReference"] = $root.google.api.ResourceReference.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldOptions message.
                 * @function verify
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.ctype != null && message.hasOwnProperty("ctype"))
                        switch (message.ctype) {
                        default:
                            return "ctype: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.packed != null && message.hasOwnProperty("packed"))
                        if (typeof message.packed !== "boolean")
                            return "packed: boolean expected";
                    if (message.jstype != null && message.hasOwnProperty("jstype"))
                        switch (message.jstype) {
                        default:
                            return "jstype: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.lazy != null && message.hasOwnProperty("lazy"))
                        if (typeof message.lazy !== "boolean")
                            return "lazy: boolean expected";
                    if (message.unverifiedLazy != null && message.hasOwnProperty("unverifiedLazy"))
                        if (typeof message.unverifiedLazy !== "boolean")
                            return "unverifiedLazy: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.weak != null && message.hasOwnProperty("weak"))
                        if (typeof message.weak !== "boolean")
                            return "weak: boolean expected";
                    if (message.debugRedact != null && message.hasOwnProperty("debugRedact"))
                        if (typeof message.debugRedact !== "boolean")
                            return "debugRedact: boolean expected";
                    if (message.retention != null && message.hasOwnProperty("retention"))
                        switch (message.retention) {
                        default:
                            return "retention: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.targets != null && message.hasOwnProperty("targets")) {
                        if (!Array.isArray(message.targets))
                            return "targets: array expected";
                        for (var i = 0; i < message.targets.length; ++i)
                            switch (message.targets[i]) {
                            default:
                                return "targets: enum value[] expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                            case 5:
                            case 6:
                            case 7:
                            case 8:
                            case 9:
                                break;
                            }
                    }
                    if (message.editionDefaults != null && message.hasOwnProperty("editionDefaults")) {
                        if (!Array.isArray(message.editionDefaults))
                            return "editionDefaults: array expected";
                        for (var i = 0; i < message.editionDefaults.length; ++i) {
                            var error = $root.google.protobuf.FieldOptions.EditionDefault.verify(message.editionDefaults[i]);
                            if (error)
                                return "editionDefaults." + error;
                        }
                    }
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.featureSupport != null && message.hasOwnProperty("featureSupport")) {
                        var error = $root.google.protobuf.FieldOptions.FeatureSupport.verify(message.featureSupport);
                        if (error)
                            return "featureSupport." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.fieldBehavior"] != null && message.hasOwnProperty(".google.api.fieldBehavior")) {
                        if (!Array.isArray(message[".google.api.fieldBehavior"]))
                            return ".google.api.fieldBehavior: array expected";
                        for (var i = 0; i < message[".google.api.fieldBehavior"].length; ++i)
                            switch (message[".google.api.fieldBehavior"][i]) {
                            default:
                                return ".google.api.fieldBehavior: enum value[] expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                            case 5:
                            case 6:
                            case 7:
                            case 8:
                                break;
                            }
                    }
                    if (message[".google.api.resourceReference"] != null && message.hasOwnProperty(".google.api.resourceReference")) {
                        var error = $root.google.api.ResourceReference.verify(message[".google.api.resourceReference"]);
                        if (error)
                            return ".google.api.resourceReference." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a FieldOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 */
                FieldOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldOptions)
                        return object;
                    var message = new $root.google.protobuf.FieldOptions();
                    switch (object.ctype) {
                    default:
                        if (typeof object.ctype === "number") {
                            message.ctype = object.ctype;
                            break;
                        }
                        break;
                    case "STRING":
                    case 0:
                        message.ctype = 0;
                        break;
                    case "CORD":
                    case 1:
                        message.ctype = 1;
                        break;
                    case "STRING_PIECE":
                    case 2:
                        message.ctype = 2;
                        break;
                    }
                    if (object.packed != null)
                        message.packed = Boolean(object.packed);
                    switch (object.jstype) {
                    default:
                        if (typeof object.jstype === "number") {
                            message.jstype = object.jstype;
                            break;
                        }
                        break;
                    case "JS_NORMAL":
                    case 0:
                        message.jstype = 0;
                        break;
                    case "JS_STRING":
                    case 1:
                        message.jstype = 1;
                        break;
                    case "JS_NUMBER":
                    case 2:
                        message.jstype = 2;
                        break;
                    }
                    if (object.lazy != null)
                        message.lazy = Boolean(object.lazy);
                    if (object.unverifiedLazy != null)
                        message.unverifiedLazy = Boolean(object.unverifiedLazy);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.weak != null)
                        message.weak = Boolean(object.weak);
                    if (object.debugRedact != null)
                        message.debugRedact = Boolean(object.debugRedact);
                    switch (object.retention) {
                    default:
                        if (typeof object.retention === "number") {
                            message.retention = object.retention;
                            break;
                        }
                        break;
                    case "RETENTION_UNKNOWN":
                    case 0:
                        message.retention = 0;
                        break;
                    case "RETENTION_RUNTIME":
                    case 1:
                        message.retention = 1;
                        break;
                    case "RETENTION_SOURCE":
                    case 2:
                        message.retention = 2;
                        break;
                    }
                    if (object.targets) {
                        if (!Array.isArray(object.targets))
                            throw TypeError(".google.protobuf.FieldOptions.targets: array expected");
                        message.targets = [];
                        for (var i = 0; i < object.targets.length; ++i)
                            switch (object.targets[i]) {
                            default:
                                if (typeof object.targets[i] === "number") {
                                    message.targets[i] = object.targets[i];
                                    break;
                                }
                            case "TARGET_TYPE_UNKNOWN":
                            case 0:
                                message.targets[i] = 0;
                                break;
                            case "TARGET_TYPE_FILE":
                            case 1:
                                message.targets[i] = 1;
                                break;
                            case "TARGET_TYPE_EXTENSION_RANGE":
                            case 2:
                                message.targets[i] = 2;
                                break;
                            case "TARGET_TYPE_MESSAGE":
                            case 3:
                                message.targets[i] = 3;
                                break;
                            case "TARGET_TYPE_FIELD":
                            case 4:
                                message.targets[i] = 4;
                                break;
                            case "TARGET_TYPE_ONEOF":
                            case 5:
                                message.targets[i] = 5;
                                break;
                            case "TARGET_TYPE_ENUM":
                            case 6:
                                message.targets[i] = 6;
                                break;
                            case "TARGET_TYPE_ENUM_ENTRY":
                            case 7:
                                message.targets[i] = 7;
                                break;
                            case "TARGET_TYPE_SERVICE":
                            case 8:
                                message.targets[i] = 8;
                                break;
                            case "TARGET_TYPE_METHOD":
                            case 9:
                                message.targets[i] = 9;
                                break;
                            }
                    }
                    if (object.editionDefaults) {
                        if (!Array.isArray(object.editionDefaults))
                            throw TypeError(".google.protobuf.FieldOptions.editionDefaults: array expected");
                        message.editionDefaults = [];
                        for (var i = 0; i < object.editionDefaults.length; ++i) {
                            if (typeof object.editionDefaults[i] !== "object")
                                throw TypeError(".google.protobuf.FieldOptions.editionDefaults: object expected");
                            message.editionDefaults[i] = $root.google.protobuf.FieldOptions.EditionDefault.fromObject(object.editionDefaults[i]);
                        }
                    }
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.FieldOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.featureSupport != null) {
                        if (typeof object.featureSupport !== "object")
                            throw TypeError(".google.protobuf.FieldOptions.featureSupport: object expected");
                        message.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.fromObject(object.featureSupport);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.FieldOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.FieldOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.fieldBehavior"]) {
                        if (!Array.isArray(object[".google.api.fieldBehavior"]))
                            throw TypeError(".google.protobuf.FieldOptions..google.api.fieldBehavior: array expected");
                        message[".google.api.fieldBehavior"] = [];
                        for (var i = 0; i < object[".google.api.fieldBehavior"].length; ++i)
                            switch (object[".google.api.fieldBehavior"][i]) {
                            default:
                                if (typeof object[".google.api.fieldBehavior"][i] === "number") {
                                    message[".google.api.fieldBehavior"][i] = object[".google.api.fieldBehavior"][i];
                                    break;
                                }
                            case "FIELD_BEHAVIOR_UNSPECIFIED":
                            case 0:
                                message[".google.api.fieldBehavior"][i] = 0;
                                break;
                            case "OPTIONAL":
                            case 1:
                                message[".google.api.fieldBehavior"][i] = 1;
                                break;
                            case "REQUIRED":
                            case 2:
                                message[".google.api.fieldBehavior"][i] = 2;
                                break;
                            case "OUTPUT_ONLY":
                            case 3:
                                message[".google.api.fieldBehavior"][i] = 3;
                                break;
                            case "INPUT_ONLY":
                            case 4:
                                message[".google.api.fieldBehavior"][i] = 4;
                                break;
                            case "IMMUTABLE":
                            case 5:
                                message[".google.api.fieldBehavior"][i] = 5;
                                break;
                            case "UNORDERED_LIST":
                            case 6:
                                message[".google.api.fieldBehavior"][i] = 6;
                                break;
                            case "NON_EMPTY_DEFAULT":
                            case 7:
                                message[".google.api.fieldBehavior"][i] = 7;
                                break;
                            case "IDENTIFIER":
                            case 8:
                                message[".google.api.fieldBehavior"][i] = 8;
                                break;
                            }
                    }
                    if (object[".google.api.resourceReference"] != null) {
                        if (typeof object[".google.api.resourceReference"] !== "object")
                            throw TypeError(".google.protobuf.FieldOptions..google.api.resourceReference: object expected");
                        message[".google.api.resourceReference"] = $root.google.api.ResourceReference.fromObject(object[".google.api.resourceReference"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.FieldOptions} message FieldOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.targets = [];
                        object.editionDefaults = [];
                        object.uninterpretedOption = [];
                        object[".google.api.fieldBehavior"] = [];
                    }
                    if (options.defaults) {
                        object.ctype = options.enums === String ? "STRING" : 0;
                        object.packed = false;
                        object.deprecated = false;
                        object.lazy = false;
                        object.jstype = options.enums === String ? "JS_NORMAL" : 0;
                        object.weak = false;
                        object.unverifiedLazy = false;
                        object.debugRedact = false;
                        object.retention = options.enums === String ? "RETENTION_UNKNOWN" : 0;
                        object.features = null;
                        object.featureSupport = null;
                        object[".google.api.resourceReference"] = null;
                    }
                    if (message.ctype != null && message.hasOwnProperty("ctype"))
                        object.ctype = options.enums === String ? $root.google.protobuf.FieldOptions.CType[message.ctype] === undefined ? message.ctype : $root.google.protobuf.FieldOptions.CType[message.ctype] : message.ctype;
                    if (message.packed != null && message.hasOwnProperty("packed"))
                        object.packed = message.packed;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.lazy != null && message.hasOwnProperty("lazy"))
                        object.lazy = message.lazy;
                    if (message.jstype != null && message.hasOwnProperty("jstype"))
                        object.jstype = options.enums === String ? $root.google.protobuf.FieldOptions.JSType[message.jstype] === undefined ? message.jstype : $root.google.protobuf.FieldOptions.JSType[message.jstype] : message.jstype;
                    if (message.weak != null && message.hasOwnProperty("weak"))
                        object.weak = message.weak;
                    if (message.unverifiedLazy != null && message.hasOwnProperty("unverifiedLazy"))
                        object.unverifiedLazy = message.unverifiedLazy;
                    if (message.debugRedact != null && message.hasOwnProperty("debugRedact"))
                        object.debugRedact = message.debugRedact;
                    if (message.retention != null && message.hasOwnProperty("retention"))
                        object.retention = options.enums === String ? $root.google.protobuf.FieldOptions.OptionRetention[message.retention] === undefined ? message.retention : $root.google.protobuf.FieldOptions.OptionRetention[message.retention] : message.retention;
                    if (message.targets && message.targets.length) {
                        object.targets = [];
                        for (var j = 0; j < message.targets.length; ++j)
                            object.targets[j] = options.enums === String ? $root.google.protobuf.FieldOptions.OptionTargetType[message.targets[j]] === undefined ? message.targets[j] : $root.google.protobuf.FieldOptions.OptionTargetType[message.targets[j]] : message.targets[j];
                    }
                    if (message.editionDefaults && message.editionDefaults.length) {
                        object.editionDefaults = [];
                        for (var j = 0; j < message.editionDefaults.length; ++j)
                            object.editionDefaults[j] = $root.google.protobuf.FieldOptions.EditionDefault.toObject(message.editionDefaults[j], options);
                    }
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.featureSupport != null && message.hasOwnProperty("featureSupport"))
                        object.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.toObject(message.featureSupport, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.fieldBehavior"] && message[".google.api.fieldBehavior"].length) {
                        object[".google.api.fieldBehavior"] = [];
                        for (var j = 0; j < message[".google.api.fieldBehavior"].length; ++j)
                            object[".google.api.fieldBehavior"][j] = options.enums === String ? $root.google.api.FieldBehavior[message[".google.api.fieldBehavior"][j]] === undefined ? message[".google.api.fieldBehavior"][j] : $root.google.api.FieldBehavior[message[".google.api.fieldBehavior"][j]] : message[".google.api.fieldBehavior"][j];
                    }
                    if (message[".google.api.resourceReference"] != null && message.hasOwnProperty(".google.api.resourceReference"))
                        object[".google.api.resourceReference"] = $root.google.api.ResourceReference.toObject(message[".google.api.resourceReference"], options);
                    return object;
                };
    
                /**
                 * Converts this FieldOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FieldOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FieldOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FieldOptions";
                };
    
                /**
                 * CType enum.
                 * @name google.protobuf.FieldOptions.CType
                 * @enum {number}
                 * @property {number} STRING=0 STRING value
                 * @property {number} CORD=1 CORD value
                 * @property {number} STRING_PIECE=2 STRING_PIECE value
                 */
                FieldOptions.CType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "STRING"] = 0;
                    values[valuesById[1] = "CORD"] = 1;
                    values[valuesById[2] = "STRING_PIECE"] = 2;
                    return values;
                })();
    
                /**
                 * JSType enum.
                 * @name google.protobuf.FieldOptions.JSType
                 * @enum {number}
                 * @property {number} JS_NORMAL=0 JS_NORMAL value
                 * @property {number} JS_STRING=1 JS_STRING value
                 * @property {number} JS_NUMBER=2 JS_NUMBER value
                 */
                FieldOptions.JSType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "JS_NORMAL"] = 0;
                    values[valuesById[1] = "JS_STRING"] = 1;
                    values[valuesById[2] = "JS_NUMBER"] = 2;
                    return values;
                })();
    
                /**
                 * OptionRetention enum.
                 * @name google.protobuf.FieldOptions.OptionRetention
                 * @enum {number}
                 * @property {number} RETENTION_UNKNOWN=0 RETENTION_UNKNOWN value
                 * @property {number} RETENTION_RUNTIME=1 RETENTION_RUNTIME value
                 * @property {number} RETENTION_SOURCE=2 RETENTION_SOURCE value
                 */
                FieldOptions.OptionRetention = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "RETENTION_UNKNOWN"] = 0;
                    values[valuesById[1] = "RETENTION_RUNTIME"] = 1;
                    values[valuesById[2] = "RETENTION_SOURCE"] = 2;
                    return values;
                })();
    
                /**
                 * OptionTargetType enum.
                 * @name google.protobuf.FieldOptions.OptionTargetType
                 * @enum {number}
                 * @property {number} TARGET_TYPE_UNKNOWN=0 TARGET_TYPE_UNKNOWN value
                 * @property {number} TARGET_TYPE_FILE=1 TARGET_TYPE_FILE value
                 * @property {number} TARGET_TYPE_EXTENSION_RANGE=2 TARGET_TYPE_EXTENSION_RANGE value
                 * @property {number} TARGET_TYPE_MESSAGE=3 TARGET_TYPE_MESSAGE value
                 * @property {number} TARGET_TYPE_FIELD=4 TARGET_TYPE_FIELD value
                 * @property {number} TARGET_TYPE_ONEOF=5 TARGET_TYPE_ONEOF value
                 * @property {number} TARGET_TYPE_ENUM=6 TARGET_TYPE_ENUM value
                 * @property {number} TARGET_TYPE_ENUM_ENTRY=7 TARGET_TYPE_ENUM_ENTRY value
                 * @property {number} TARGET_TYPE_SERVICE=8 TARGET_TYPE_SERVICE value
                 * @property {number} TARGET_TYPE_METHOD=9 TARGET_TYPE_METHOD value
                 */
                FieldOptions.OptionTargetType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "TARGET_TYPE_UNKNOWN"] = 0;
                    values[valuesById[1] = "TARGET_TYPE_FILE"] = 1;
                    values[valuesById[2] = "TARGET_TYPE_EXTENSION_RANGE"] = 2;
                    values[valuesById[3] = "TARGET_TYPE_MESSAGE"] = 3;
                    values[valuesById[4] = "TARGET_TYPE_FIELD"] = 4;
                    values[valuesById[5] = "TARGET_TYPE_ONEOF"] = 5;
                    values[valuesById[6] = "TARGET_TYPE_ENUM"] = 6;
                    values[valuesById[7] = "TARGET_TYPE_ENUM_ENTRY"] = 7;
                    values[valuesById[8] = "TARGET_TYPE_SERVICE"] = 8;
                    values[valuesById[9] = "TARGET_TYPE_METHOD"] = 9;
                    return values;
                })();
    
                FieldOptions.EditionDefault = (function() {
    
                    /**
                     * Properties of an EditionDefault.
                     * @memberof google.protobuf.FieldOptions
                     * @interface IEditionDefault
                     * @property {google.protobuf.Edition|null} [edition] EditionDefault edition
                     * @property {string|null} [value] EditionDefault value
                     */
    
                    /**
                     * Constructs a new EditionDefault.
                     * @memberof google.protobuf.FieldOptions
                     * @classdesc Represents an EditionDefault.
                     * @implements IEditionDefault
                     * @constructor
                     * @param {google.protobuf.FieldOptions.IEditionDefault=} [properties] Properties to set
                     */
                    function EditionDefault(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * EditionDefault edition.
                     * @member {google.protobuf.Edition} edition
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @instance
                     */
                    EditionDefault.prototype.edition = 0;
    
                    /**
                     * EditionDefault value.
                     * @member {string} value
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @instance
                     */
                    EditionDefault.prototype.value = "";
    
                    /**
                     * Creates a new EditionDefault instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {google.protobuf.FieldOptions.IEditionDefault=} [properties] Properties to set
                     * @returns {google.protobuf.FieldOptions.EditionDefault} EditionDefault instance
                     */
                    EditionDefault.create = function create(properties) {
                        return new EditionDefault(properties);
                    };
    
                    /**
                     * Encodes the specified EditionDefault message. Does not implicitly {@link google.protobuf.FieldOptions.EditionDefault.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {google.protobuf.FieldOptions.IEditionDefault} message EditionDefault message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EditionDefault.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.value);
                        if (message.edition != null && Object.hasOwnProperty.call(message, "edition"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.edition);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified EditionDefault message, length delimited. Does not implicitly {@link google.protobuf.FieldOptions.EditionDefault.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {google.protobuf.FieldOptions.IEditionDefault} message EditionDefault message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EditionDefault.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an EditionDefault message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.FieldOptions.EditionDefault} EditionDefault
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EditionDefault.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldOptions.EditionDefault();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 3: {
                                    message.edition = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.value = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an EditionDefault message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.FieldOptions.EditionDefault} EditionDefault
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EditionDefault.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an EditionDefault message.
                     * @function verify
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    EditionDefault.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.edition != null && message.hasOwnProperty("edition"))
                            switch (message.edition) {
                            default:
                                return "edition: enum value expected";
                            case 0:
                            case 900:
                            case 998:
                            case 999:
                            case 1000:
                            case 1001:
                            case 1:
                            case 2:
                            case 99997:
                            case 99998:
                            case 99999:
                            case 2147483647:
                                break;
                            }
                        if (message.value != null && message.hasOwnProperty("value"))
                            if (!$util.isString(message.value))
                                return "value: string expected";
                        return null;
                    };
    
                    /**
                     * Creates an EditionDefault message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.FieldOptions.EditionDefault} EditionDefault
                     */
                    EditionDefault.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.FieldOptions.EditionDefault)
                            return object;
                        var message = new $root.google.protobuf.FieldOptions.EditionDefault();
                        switch (object.edition) {
                        default:
                            if (typeof object.edition === "number") {
                                message.edition = object.edition;
                                break;
                            }
                            break;
                        case "EDITION_UNKNOWN":
                        case 0:
                            message.edition = 0;
                            break;
                        case "EDITION_LEGACY":
                        case 900:
                            message.edition = 900;
                            break;
                        case "EDITION_PROTO2":
                        case 998:
                            message.edition = 998;
                            break;
                        case "EDITION_PROTO3":
                        case 999:
                            message.edition = 999;
                            break;
                        case "EDITION_2023":
                        case 1000:
                            message.edition = 1000;
                            break;
                        case "EDITION_2024":
                        case 1001:
                            message.edition = 1001;
                            break;
                        case "EDITION_1_TEST_ONLY":
                        case 1:
                            message.edition = 1;
                            break;
                        case "EDITION_2_TEST_ONLY":
                        case 2:
                            message.edition = 2;
                            break;
                        case "EDITION_99997_TEST_ONLY":
                        case 99997:
                            message.edition = 99997;
                            break;
                        case "EDITION_99998_TEST_ONLY":
                        case 99998:
                            message.edition = 99998;
                            break;
                        case "EDITION_99999_TEST_ONLY":
                        case 99999:
                            message.edition = 99999;
                            break;
                        case "EDITION_MAX":
                        case 2147483647:
                            message.edition = 2147483647;
                            break;
                        }
                        if (object.value != null)
                            message.value = String(object.value);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an EditionDefault message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {google.protobuf.FieldOptions.EditionDefault} message EditionDefault
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    EditionDefault.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.value = "";
                            object.edition = options.enums === String ? "EDITION_UNKNOWN" : 0;
                        }
                        if (message.value != null && message.hasOwnProperty("value"))
                            object.value = message.value;
                        if (message.edition != null && message.hasOwnProperty("edition"))
                            object.edition = options.enums === String ? $root.google.protobuf.Edition[message.edition] === undefined ? message.edition : $root.google.protobuf.Edition[message.edition] : message.edition;
                        return object;
                    };
    
                    /**
                     * Converts this EditionDefault to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    EditionDefault.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for EditionDefault
                     * @function getTypeUrl
                     * @memberof google.protobuf.FieldOptions.EditionDefault
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    EditionDefault.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.FieldOptions.EditionDefault";
                    };
    
                    return EditionDefault;
                })();
    
                FieldOptions.FeatureSupport = (function() {
    
                    /**
                     * Properties of a FeatureSupport.
                     * @memberof google.protobuf.FieldOptions
                     * @interface IFeatureSupport
                     * @property {google.protobuf.Edition|null} [editionIntroduced] FeatureSupport editionIntroduced
                     * @property {google.protobuf.Edition|null} [editionDeprecated] FeatureSupport editionDeprecated
                     * @property {string|null} [deprecationWarning] FeatureSupport deprecationWarning
                     * @property {google.protobuf.Edition|null} [editionRemoved] FeatureSupport editionRemoved
                     */
    
                    /**
                     * Constructs a new FeatureSupport.
                     * @memberof google.protobuf.FieldOptions
                     * @classdesc Represents a FeatureSupport.
                     * @implements IFeatureSupport
                     * @constructor
                     * @param {google.protobuf.FieldOptions.IFeatureSupport=} [properties] Properties to set
                     */
                    function FeatureSupport(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * FeatureSupport editionIntroduced.
                     * @member {google.protobuf.Edition} editionIntroduced
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @instance
                     */
                    FeatureSupport.prototype.editionIntroduced = 0;
    
                    /**
                     * FeatureSupport editionDeprecated.
                     * @member {google.protobuf.Edition} editionDeprecated
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @instance
                     */
                    FeatureSupport.prototype.editionDeprecated = 0;
    
                    /**
                     * FeatureSupport deprecationWarning.
                     * @member {string} deprecationWarning
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @instance
                     */
                    FeatureSupport.prototype.deprecationWarning = "";
    
                    /**
                     * FeatureSupport editionRemoved.
                     * @member {google.protobuf.Edition} editionRemoved
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @instance
                     */
                    FeatureSupport.prototype.editionRemoved = 0;
    
                    /**
                     * Creates a new FeatureSupport instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {google.protobuf.FieldOptions.IFeatureSupport=} [properties] Properties to set
                     * @returns {google.protobuf.FieldOptions.FeatureSupport} FeatureSupport instance
                     */
                    FeatureSupport.create = function create(properties) {
                        return new FeatureSupport(properties);
                    };
    
                    /**
                     * Encodes the specified FeatureSupport message. Does not implicitly {@link google.protobuf.FieldOptions.FeatureSupport.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {google.protobuf.FieldOptions.IFeatureSupport} message FeatureSupport message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FeatureSupport.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.editionIntroduced != null && Object.hasOwnProperty.call(message, "editionIntroduced"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.editionIntroduced);
                        if (message.editionDeprecated != null && Object.hasOwnProperty.call(message, "editionDeprecated"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.editionDeprecated);
                        if (message.deprecationWarning != null && Object.hasOwnProperty.call(message, "deprecationWarning"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.deprecationWarning);
                        if (message.editionRemoved != null && Object.hasOwnProperty.call(message, "editionRemoved"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.editionRemoved);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified FeatureSupport message, length delimited. Does not implicitly {@link google.protobuf.FieldOptions.FeatureSupport.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {google.protobuf.FieldOptions.IFeatureSupport} message FeatureSupport message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FeatureSupport.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a FeatureSupport message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.FieldOptions.FeatureSupport} FeatureSupport
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FeatureSupport.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldOptions.FeatureSupport();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.editionIntroduced = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.editionDeprecated = reader.int32();
                                    break;
                                }
                            case 3: {
                                    message.deprecationWarning = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.editionRemoved = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a FeatureSupport message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.FieldOptions.FeatureSupport} FeatureSupport
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FeatureSupport.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a FeatureSupport message.
                     * @function verify
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    FeatureSupport.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.editionIntroduced != null && message.hasOwnProperty("editionIntroduced"))
                            switch (message.editionIntroduced) {
                            default:
                                return "editionIntroduced: enum value expected";
                            case 0:
                            case 900:
                            case 998:
                            case 999:
                            case 1000:
                            case 1001:
                            case 1:
                            case 2:
                            case 99997:
                            case 99998:
                            case 99999:
                            case 2147483647:
                                break;
                            }
                        if (message.editionDeprecated != null && message.hasOwnProperty("editionDeprecated"))
                            switch (message.editionDeprecated) {
                            default:
                                return "editionDeprecated: enum value expected";
                            case 0:
                            case 900:
                            case 998:
                            case 999:
                            case 1000:
                            case 1001:
                            case 1:
                            case 2:
                            case 99997:
                            case 99998:
                            case 99999:
                            case 2147483647:
                                break;
                            }
                        if (message.deprecationWarning != null && message.hasOwnProperty("deprecationWarning"))
                            if (!$util.isString(message.deprecationWarning))
                                return "deprecationWarning: string expected";
                        if (message.editionRemoved != null && message.hasOwnProperty("editionRemoved"))
                            switch (message.editionRemoved) {
                            default:
                                return "editionRemoved: enum value expected";
                            case 0:
                            case 900:
                            case 998:
                            case 999:
                            case 1000:
                            case 1001:
                            case 1:
                            case 2:
                            case 99997:
                            case 99998:
                            case 99999:
                            case 2147483647:
                                break;
                            }
                        return null;
                    };
    
                    /**
                     * Creates a FeatureSupport message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.FieldOptions.FeatureSupport} FeatureSupport
                     */
                    FeatureSupport.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.FieldOptions.FeatureSupport)
                            return object;
                        var message = new $root.google.protobuf.FieldOptions.FeatureSupport();
                        switch (object.editionIntroduced) {
                        default:
                            if (typeof object.editionIntroduced === "number") {
                                message.editionIntroduced = object.editionIntroduced;
                                break;
                            }
                            break;
                        case "EDITION_UNKNOWN":
                        case 0:
                            message.editionIntroduced = 0;
                            break;
                        case "EDITION_LEGACY":
                        case 900:
                            message.editionIntroduced = 900;
                            break;
                        case "EDITION_PROTO2":
                        case 998:
                            message.editionIntroduced = 998;
                            break;
                        case "EDITION_PROTO3":
                        case 999:
                            message.editionIntroduced = 999;
                            break;
                        case "EDITION_2023":
                        case 1000:
                            message.editionIntroduced = 1000;
                            break;
                        case "EDITION_2024":
                        case 1001:
                            message.editionIntroduced = 1001;
                            break;
                        case "EDITION_1_TEST_ONLY":
                        case 1:
                            message.editionIntroduced = 1;
                            break;
                        case "EDITION_2_TEST_ONLY":
                        case 2:
                            message.editionIntroduced = 2;
                            break;
                        case "EDITION_99997_TEST_ONLY":
                        case 99997:
                            message.editionIntroduced = 99997;
                            break;
                        case "EDITION_99998_TEST_ONLY":
                        case 99998:
                            message.editionIntroduced = 99998;
                            break;
                        case "EDITION_99999_TEST_ONLY":
                        case 99999:
                            message.editionIntroduced = 99999;
                            break;
                        case "EDITION_MAX":
                        case 2147483647:
                            message.editionIntroduced = 2147483647;
                            break;
                        }
                        switch (object.editionDeprecated) {
                        default:
                            if (typeof object.editionDeprecated === "number") {
                                message.editionDeprecated = object.editionDeprecated;
                                break;
                            }
                            break;
                        case "EDITION_UNKNOWN":
                        case 0:
                            message.editionDeprecated = 0;
                            break;
                        case "EDITION_LEGACY":
                        case 900:
                            message.editionDeprecated = 900;
                            break;
                        case "EDITION_PROTO2":
                        case 998:
                            message.editionDeprecated = 998;
                            break;
                        case "EDITION_PROTO3":
                        case 999:
                            message.editionDeprecated = 999;
                            break;
                        case "EDITION_2023":
                        case 1000:
                            message.editionDeprecated = 1000;
                            break;
                        case "EDITION_2024":
                        case 1001:
                            message.editionDeprecated = 1001;
                            break;
                        case "EDITION_1_TEST_ONLY":
                        case 1:
                            message.editionDeprecated = 1;
                            break;
                        case "EDITION_2_TEST_ONLY":
                        case 2:
                            message.editionDeprecated = 2;
                            break;
                        case "EDITION_99997_TEST_ONLY":
                        case 99997:
                            message.editionDeprecated = 99997;
                            break;
                        case "EDITION_99998_TEST_ONLY":
                        case 99998:
                            message.editionDeprecated = 99998;
                            break;
                        case "EDITION_99999_TEST_ONLY":
                        case 99999:
                            message.editionDeprecated = 99999;
                            break;
                        case "EDITION_MAX":
                        case 2147483647:
                            message.editionDeprecated = 2147483647;
                            break;
                        }
                        if (object.deprecationWarning != null)
                            message.deprecationWarning = String(object.deprecationWarning);
                        switch (object.editionRemoved) {
                        default:
                            if (typeof object.editionRemoved === "number") {
                                message.editionRemoved = object.editionRemoved;
                                break;
                            }
                            break;
                        case "EDITION_UNKNOWN":
                        case 0:
                            message.editionRemoved = 0;
                            break;
                        case "EDITION_LEGACY":
                        case 900:
                            message.editionRemoved = 900;
                            break;
                        case "EDITION_PROTO2":
                        case 998:
                            message.editionRemoved = 998;
                            break;
                        case "EDITION_PROTO3":
                        case 999:
                            message.editionRemoved = 999;
                            break;
                        case "EDITION_2023":
                        case 1000:
                            message.editionRemoved = 1000;
                            break;
                        case "EDITION_2024":
                        case 1001:
                            message.editionRemoved = 1001;
                            break;
                        case "EDITION_1_TEST_ONLY":
                        case 1:
                            message.editionRemoved = 1;
                            break;
                        case "EDITION_2_TEST_ONLY":
                        case 2:
                            message.editionRemoved = 2;
                            break;
                        case "EDITION_99997_TEST_ONLY":
                        case 99997:
                            message.editionRemoved = 99997;
                            break;
                        case "EDITION_99998_TEST_ONLY":
                        case 99998:
                            message.editionRemoved = 99998;
                            break;
                        case "EDITION_99999_TEST_ONLY":
                        case 99999:
                            message.editionRemoved = 99999;
                            break;
                        case "EDITION_MAX":
                        case 2147483647:
                            message.editionRemoved = 2147483647;
                            break;
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a FeatureSupport message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {google.protobuf.FieldOptions.FeatureSupport} message FeatureSupport
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    FeatureSupport.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.editionIntroduced = options.enums === String ? "EDITION_UNKNOWN" : 0;
                            object.editionDeprecated = options.enums === String ? "EDITION_UNKNOWN" : 0;
                            object.deprecationWarning = "";
                            object.editionRemoved = options.enums === String ? "EDITION_UNKNOWN" : 0;
                        }
                        if (message.editionIntroduced != null && message.hasOwnProperty("editionIntroduced"))
                            object.editionIntroduced = options.enums === String ? $root.google.protobuf.Edition[message.editionIntroduced] === undefined ? message.editionIntroduced : $root.google.protobuf.Edition[message.editionIntroduced] : message.editionIntroduced;
                        if (message.editionDeprecated != null && message.hasOwnProperty("editionDeprecated"))
                            object.editionDeprecated = options.enums === String ? $root.google.protobuf.Edition[message.editionDeprecated] === undefined ? message.editionDeprecated : $root.google.protobuf.Edition[message.editionDeprecated] : message.editionDeprecated;
                        if (message.deprecationWarning != null && message.hasOwnProperty("deprecationWarning"))
                            object.deprecationWarning = message.deprecationWarning;
                        if (message.editionRemoved != null && message.hasOwnProperty("editionRemoved"))
                            object.editionRemoved = options.enums === String ? $root.google.protobuf.Edition[message.editionRemoved] === undefined ? message.editionRemoved : $root.google.protobuf.Edition[message.editionRemoved] : message.editionRemoved;
                        return object;
                    };
    
                    /**
                     * Converts this FeatureSupport to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    FeatureSupport.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for FeatureSupport
                     * @function getTypeUrl
                     * @memberof google.protobuf.FieldOptions.FeatureSupport
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    FeatureSupport.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.FieldOptions.FeatureSupport";
                    };
    
                    return FeatureSupport;
                })();
    
                return FieldOptions;
            })();
    
            protobuf.OneofOptions = (function() {
    
                /**
                 * Properties of an OneofOptions.
                 * @memberof google.protobuf
                 * @interface IOneofOptions
                 * @property {google.protobuf.IFeatureSet|null} [features] OneofOptions features
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] OneofOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new OneofOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an OneofOptions.
                 * @implements IOneofOptions
                 * @constructor
                 * @param {google.protobuf.IOneofOptions=} [properties] Properties to set
                 */
                function OneofOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OneofOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.OneofOptions
                 * @instance
                 */
                OneofOptions.prototype.features = null;
    
                /**
                 * OneofOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.OneofOptions
                 * @instance
                 */
                OneofOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new OneofOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions=} [properties] Properties to set
                 * @returns {google.protobuf.OneofOptions} OneofOptions instance
                 */
                OneofOptions.create = function create(properties) {
                    return new OneofOptions(properties);
                };
    
                /**
                 * Encodes the specified OneofOptions message. Does not implicitly {@link google.protobuf.OneofOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions} message OneofOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified OneofOptions message, length delimited. Does not implicitly {@link google.protobuf.OneofOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions} message OneofOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OneofOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.OneofOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OneofOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OneofOptions message.
                 * @function verify
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OneofOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an OneofOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 */
                OneofOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.OneofOptions)
                        return object;
                    var message = new $root.google.protobuf.OneofOptions();
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.OneofOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.OneofOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.OneofOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an OneofOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.OneofOptions} message OneofOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OneofOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults)
                        object.features = null;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this OneofOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.OneofOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OneofOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for OneofOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                OneofOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.OneofOptions";
                };
    
                return OneofOptions;
            })();
    
            protobuf.EnumOptions = (function() {
    
                /**
                 * Properties of an EnumOptions.
                 * @memberof google.protobuf
                 * @interface IEnumOptions
                 * @property {boolean|null} [allowAlias] EnumOptions allowAlias
                 * @property {boolean|null} [deprecated] EnumOptions deprecated
                 * @property {boolean|null} [deprecatedLegacyJsonFieldConflicts] EnumOptions deprecatedLegacyJsonFieldConflicts
                 * @property {google.protobuf.IFeatureSet|null} [features] EnumOptions features
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] EnumOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new EnumOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumOptions.
                 * @implements IEnumOptions
                 * @constructor
                 * @param {google.protobuf.IEnumOptions=} [properties] Properties to set
                 */
                function EnumOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumOptions allowAlias.
                 * @member {boolean} allowAlias
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.allowAlias = false;
    
                /**
                 * EnumOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.deprecated = false;
    
                /**
                 * EnumOptions deprecatedLegacyJsonFieldConflicts.
                 * @member {boolean} deprecatedLegacyJsonFieldConflicts
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.deprecatedLegacyJsonFieldConflicts = false;
    
                /**
                 * EnumOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.features = null;
    
                /**
                 * EnumOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new EnumOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions=} [properties] Properties to set
                 * @returns {google.protobuf.EnumOptions} EnumOptions instance
                 */
                EnumOptions.create = function create(properties) {
                    return new EnumOptions(properties);
                };
    
                /**
                 * Encodes the specified EnumOptions message. Does not implicitly {@link google.protobuf.EnumOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions} message EnumOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.allowAlias != null && Object.hasOwnProperty.call(message, "allowAlias"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.allowAlias);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.deprecatedLegacyJsonFieldConflicts != null && Object.hasOwnProperty.call(message, "deprecatedLegacyJsonFieldConflicts"))
                        writer.uint32(/* id 6, wireType 0 =*/48).bool(message.deprecatedLegacyJsonFieldConflicts);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumOptions message, length delimited. Does not implicitly {@link google.protobuf.EnumOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions} message EnumOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 2: {
                                message.allowAlias = reader.bool();
                                break;
                            }
                        case 3: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 6: {
                                message.deprecatedLegacyJsonFieldConflicts = reader.bool();
                                break;
                            }
                        case 7: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumOptions message.
                 * @function verify
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.allowAlias != null && message.hasOwnProperty("allowAlias"))
                        if (typeof message.allowAlias !== "boolean")
                            return "allowAlias: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.deprecatedLegacyJsonFieldConflicts != null && message.hasOwnProperty("deprecatedLegacyJsonFieldConflicts"))
                        if (typeof message.deprecatedLegacyJsonFieldConflicts !== "boolean")
                            return "deprecatedLegacyJsonFieldConflicts: boolean expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 */
                EnumOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumOptions)
                        return object;
                    var message = new $root.google.protobuf.EnumOptions();
                    if (object.allowAlias != null)
                        message.allowAlias = Boolean(object.allowAlias);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.deprecatedLegacyJsonFieldConflicts != null)
                        message.deprecatedLegacyJsonFieldConflicts = Boolean(object.deprecatedLegacyJsonFieldConflicts);
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.EnumOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.EnumOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.EnumOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.EnumOptions} message EnumOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.allowAlias = false;
                        object.deprecated = false;
                        object.deprecatedLegacyJsonFieldConflicts = false;
                        object.features = null;
                    }
                    if (message.allowAlias != null && message.hasOwnProperty("allowAlias"))
                        object.allowAlias = message.allowAlias;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.deprecatedLegacyJsonFieldConflicts != null && message.hasOwnProperty("deprecatedLegacyJsonFieldConflicts"))
                        object.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this EnumOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for EnumOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                EnumOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.EnumOptions";
                };
    
                return EnumOptions;
            })();
    
            protobuf.EnumValueOptions = (function() {
    
                /**
                 * Properties of an EnumValueOptions.
                 * @memberof google.protobuf
                 * @interface IEnumValueOptions
                 * @property {boolean|null} [deprecated] EnumValueOptions deprecated
                 * @property {google.protobuf.IFeatureSet|null} [features] EnumValueOptions features
                 * @property {boolean|null} [debugRedact] EnumValueOptions debugRedact
                 * @property {google.protobuf.FieldOptions.IFeatureSupport|null} [featureSupport] EnumValueOptions featureSupport
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] EnumValueOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new EnumValueOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumValueOptions.
                 * @implements IEnumValueOptions
                 * @constructor
                 * @param {google.protobuf.IEnumValueOptions=} [properties] Properties to set
                 */
                function EnumValueOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumValueOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.deprecated = false;
    
                /**
                 * EnumValueOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.features = null;
    
                /**
                 * EnumValueOptions debugRedact.
                 * @member {boolean} debugRedact
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.debugRedact = false;
    
                /**
                 * EnumValueOptions featureSupport.
                 * @member {google.protobuf.FieldOptions.IFeatureSupport|null|undefined} featureSupport
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.featureSupport = null;
    
                /**
                 * EnumValueOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new EnumValueOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions=} [properties] Properties to set
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions instance
                 */
                EnumValueOptions.create = function create(properties) {
                    return new EnumValueOptions(properties);
                };
    
                /**
                 * Encodes the specified EnumValueOptions message. Does not implicitly {@link google.protobuf.EnumValueOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions} message EnumValueOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 1, wireType 0 =*/8).bool(message.deprecated);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.debugRedact != null && Object.hasOwnProperty.call(message, "debugRedact"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.debugRedact);
                    if (message.featureSupport != null && Object.hasOwnProperty.call(message, "featureSupport"))
                        $root.google.protobuf.FieldOptions.FeatureSupport.encode(message.featureSupport, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumValueOptions message, length delimited. Does not implicitly {@link google.protobuf.EnumValueOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions} message EnumValueOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumValueOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumValueOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 2: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 3: {
                                message.debugRedact = reader.bool();
                                break;
                            }
                        case 4: {
                                message.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumValueOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumValueOptions message.
                 * @function verify
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumValueOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.debugRedact != null && message.hasOwnProperty("debugRedact"))
                        if (typeof message.debugRedact !== "boolean")
                            return "debugRedact: boolean expected";
                    if (message.featureSupport != null && message.hasOwnProperty("featureSupport")) {
                        var error = $root.google.protobuf.FieldOptions.FeatureSupport.verify(message.featureSupport);
                        if (error)
                            return "featureSupport." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumValueOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 */
                EnumValueOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumValueOptions)
                        return object;
                    var message = new $root.google.protobuf.EnumValueOptions();
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.EnumValueOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.debugRedact != null)
                        message.debugRedact = Boolean(object.debugRedact);
                    if (object.featureSupport != null) {
                        if (typeof object.featureSupport !== "object")
                            throw TypeError(".google.protobuf.EnumValueOptions.featureSupport: object expected");
                        message.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.fromObject(object.featureSupport);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.EnumValueOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.EnumValueOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumValueOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.EnumValueOptions} message EnumValueOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumValueOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.deprecated = false;
                        object.features = null;
                        object.debugRedact = false;
                        object.featureSupport = null;
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.debugRedact != null && message.hasOwnProperty("debugRedact"))
                        object.debugRedact = message.debugRedact;
                    if (message.featureSupport != null && message.hasOwnProperty("featureSupport"))
                        object.featureSupport = $root.google.protobuf.FieldOptions.FeatureSupport.toObject(message.featureSupport, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this EnumValueOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumValueOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for EnumValueOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                EnumValueOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.EnumValueOptions";
                };
    
                return EnumValueOptions;
            })();
    
            protobuf.ServiceOptions = (function() {
    
                /**
                 * Properties of a ServiceOptions.
                 * @memberof google.protobuf
                 * @interface IServiceOptions
                 * @property {google.protobuf.IFeatureSet|null} [features] ServiceOptions features
                 * @property {boolean|null} [deprecated] ServiceOptions deprecated
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] ServiceOptions uninterpretedOption
                 * @property {string|null} [".google.api.defaultHost"] ServiceOptions .google.api.defaultHost
                 * @property {string|null} [".google.api.oauthScopes"] ServiceOptions .google.api.oauthScopes
                 * @property {string|null} [".google.api.apiVersion"] ServiceOptions .google.api.apiVersion
                 */
    
                /**
                 * Constructs a new ServiceOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a ServiceOptions.
                 * @implements IServiceOptions
                 * @constructor
                 * @param {google.protobuf.IServiceOptions=} [properties] Properties to set
                 */
                function ServiceOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ServiceOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype.features = null;
    
                /**
                 * ServiceOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype.deprecated = false;
    
                /**
                 * ServiceOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * ServiceOptions .google.api.defaultHost.
                 * @member {string} .google.api.defaultHost
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype[".google.api.defaultHost"] = "";
    
                /**
                 * ServiceOptions .google.api.oauthScopes.
                 * @member {string} .google.api.oauthScopes
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype[".google.api.oauthScopes"] = "";
    
                /**
                 * ServiceOptions .google.api.apiVersion.
                 * @member {string} .google.api.apiVersion
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype[".google.api.apiVersion"] = "";
    
                /**
                 * Creates a new ServiceOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions=} [properties] Properties to set
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions instance
                 */
                ServiceOptions.create = function create(properties) {
                    return new ServiceOptions(properties);
                };
    
                /**
                 * Encodes the specified ServiceOptions message. Does not implicitly {@link google.protobuf.ServiceOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions} message ServiceOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 33, wireType 0 =*/264).bool(message.deprecated);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 34, wireType 2 =*/274).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.defaultHost"] != null && Object.hasOwnProperty.call(message, ".google.api.defaultHost"))
                        writer.uint32(/* id 1049, wireType 2 =*/8394).string(message[".google.api.defaultHost"]);
                    if (message[".google.api.oauthScopes"] != null && Object.hasOwnProperty.call(message, ".google.api.oauthScopes"))
                        writer.uint32(/* id 1050, wireType 2 =*/8402).string(message[".google.api.oauthScopes"]);
                    if (message[".google.api.apiVersion"] != null && Object.hasOwnProperty.call(message, ".google.api.apiVersion"))
                        writer.uint32(/* id 525000001, wireType 2 =*/4200000010).string(message[".google.api.apiVersion"]);
                    return writer;
                };
    
                /**
                 * Encodes the specified ServiceOptions message, length delimited. Does not implicitly {@link google.protobuf.ServiceOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions} message ServiceOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ServiceOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ServiceOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 34: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 33: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 1049: {
                                message[".google.api.defaultHost"] = reader.string();
                                break;
                            }
                        case 1050: {
                                message[".google.api.oauthScopes"] = reader.string();
                                break;
                            }
                        case 525000001: {
                                message[".google.api.apiVersion"] = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ServiceOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ServiceOptions message.
                 * @function verify
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ServiceOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.defaultHost"] != null && message.hasOwnProperty(".google.api.defaultHost"))
                        if (!$util.isString(message[".google.api.defaultHost"]))
                            return ".google.api.defaultHost: string expected";
                    if (message[".google.api.oauthScopes"] != null && message.hasOwnProperty(".google.api.oauthScopes"))
                        if (!$util.isString(message[".google.api.oauthScopes"]))
                            return ".google.api.oauthScopes: string expected";
                    if (message[".google.api.apiVersion"] != null && message.hasOwnProperty(".google.api.apiVersion"))
                        if (!$util.isString(message[".google.api.apiVersion"]))
                            return ".google.api.apiVersion: string expected";
                    return null;
                };
    
                /**
                 * Creates a ServiceOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 */
                ServiceOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ServiceOptions)
                        return object;
                    var message = new $root.google.protobuf.ServiceOptions();
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.ServiceOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.ServiceOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.ServiceOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.defaultHost"] != null)
                        message[".google.api.defaultHost"] = String(object[".google.api.defaultHost"]);
                    if (object[".google.api.oauthScopes"] != null)
                        message[".google.api.oauthScopes"] = String(object[".google.api.oauthScopes"]);
                    if (object[".google.api.apiVersion"] != null)
                        message[".google.api.apiVersion"] = String(object[".google.api.apiVersion"]);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ServiceOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.ServiceOptions} message ServiceOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ServiceOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.deprecated = false;
                        object.features = null;
                        object[".google.api.defaultHost"] = "";
                        object[".google.api.oauthScopes"] = "";
                        object[".google.api.apiVersion"] = "";
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.defaultHost"] != null && message.hasOwnProperty(".google.api.defaultHost"))
                        object[".google.api.defaultHost"] = message[".google.api.defaultHost"];
                    if (message[".google.api.oauthScopes"] != null && message.hasOwnProperty(".google.api.oauthScopes"))
                        object[".google.api.oauthScopes"] = message[".google.api.oauthScopes"];
                    if (message[".google.api.apiVersion"] != null && message.hasOwnProperty(".google.api.apiVersion"))
                        object[".google.api.apiVersion"] = message[".google.api.apiVersion"];
                    return object;
                };
    
                /**
                 * Converts this ServiceOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ServiceOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ServiceOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ServiceOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.ServiceOptions";
                };
    
                return ServiceOptions;
            })();
    
            protobuf.MethodOptions = (function() {
    
                /**
                 * Properties of a MethodOptions.
                 * @memberof google.protobuf
                 * @interface IMethodOptions
                 * @property {boolean|null} [deprecated] MethodOptions deprecated
                 * @property {google.protobuf.MethodOptions.IdempotencyLevel|null} [idempotencyLevel] MethodOptions idempotencyLevel
                 * @property {google.protobuf.IFeatureSet|null} [features] MethodOptions features
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] MethodOptions uninterpretedOption
                 * @property {google.api.IHttpRule|null} [".google.api.http"] MethodOptions .google.api.http
                 * @property {Array.<string>|null} [".google.api.methodSignature"] MethodOptions .google.api.methodSignature
                 * @property {google.longrunning.IOperationInfo|null} [".google.longrunning.operationInfo"] MethodOptions .google.longrunning.operationInfo
                 */
    
                /**
                 * Constructs a new MethodOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a MethodOptions.
                 * @implements IMethodOptions
                 * @constructor
                 * @param {google.protobuf.IMethodOptions=} [properties] Properties to set
                 */
                function MethodOptions(properties) {
                    this.uninterpretedOption = [];
                    this[".google.api.methodSignature"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MethodOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.deprecated = false;
    
                /**
                 * MethodOptions idempotencyLevel.
                 * @member {google.protobuf.MethodOptions.IdempotencyLevel} idempotencyLevel
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.idempotencyLevel = 0;
    
                /**
                 * MethodOptions features.
                 * @member {google.protobuf.IFeatureSet|null|undefined} features
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.features = null;
    
                /**
                 * MethodOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * MethodOptions .google.api.http.
                 * @member {google.api.IHttpRule|null|undefined} .google.api.http
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.api.http"] = null;
    
                /**
                 * MethodOptions .google.api.methodSignature.
                 * @member {Array.<string>} .google.api.methodSignature
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.api.methodSignature"] = $util.emptyArray;
    
                /**
                 * MethodOptions .google.longrunning.operationInfo.
                 * @member {google.longrunning.IOperationInfo|null|undefined} .google.longrunning.operationInfo
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.longrunning.operationInfo"] = null;
    
                /**
                 * Creates a new MethodOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions=} [properties] Properties to set
                 * @returns {google.protobuf.MethodOptions} MethodOptions instance
                 */
                MethodOptions.create = function create(properties) {
                    return new MethodOptions(properties);
                };
    
                /**
                 * Encodes the specified MethodOptions message. Does not implicitly {@link google.protobuf.MethodOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions} message MethodOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 33, wireType 0 =*/264).bool(message.deprecated);
                    if (message.idempotencyLevel != null && Object.hasOwnProperty.call(message, "idempotencyLevel"))
                        writer.uint32(/* id 34, wireType 0 =*/272).int32(message.idempotencyLevel);
                    if (message.features != null && Object.hasOwnProperty.call(message, "features"))
                        $root.google.protobuf.FeatureSet.encode(message.features, writer.uint32(/* id 35, wireType 2 =*/282).fork()).ldelim();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.longrunning.operationInfo"] != null && Object.hasOwnProperty.call(message, ".google.longrunning.operationInfo"))
                        $root.google.longrunning.OperationInfo.encode(message[".google.longrunning.operationInfo"], writer.uint32(/* id 1049, wireType 2 =*/8394).fork()).ldelim();
                    if (message[".google.api.methodSignature"] != null && message[".google.api.methodSignature"].length)
                        for (var i = 0; i < message[".google.api.methodSignature"].length; ++i)
                            writer.uint32(/* id 1051, wireType 2 =*/8410).string(message[".google.api.methodSignature"][i]);
                    if (message[".google.api.http"] != null && Object.hasOwnProperty.call(message, ".google.api.http"))
                        $root.google.api.HttpRule.encode(message[".google.api.http"], writer.uint32(/* id 72295728, wireType 2 =*/578365826).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MethodOptions message, length delimited. Does not implicitly {@link google.protobuf.MethodOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions} message MethodOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MethodOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodOptions.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MethodOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 33: {
                                message.deprecated = reader.bool();
                                break;
                            }
                        case 34: {
                                message.idempotencyLevel = reader.int32();
                                break;
                            }
                        case 35: {
                                message.features = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                break;
                            }
                        case 999: {
                                if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                    message.uninterpretedOption = [];
                                message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                                break;
                            }
                        case 72295728: {
                                message[".google.api.http"] = $root.google.api.HttpRule.decode(reader, reader.uint32());
                                break;
                            }
                        case 1051: {
                                if (!(message[".google.api.methodSignature"] && message[".google.api.methodSignature"].length))
                                    message[".google.api.methodSignature"] = [];
                                message[".google.api.methodSignature"].push(reader.string());
                                break;
                            }
                        case 1049: {
                                message[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MethodOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MethodOptions message.
                 * @function verify
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MethodOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.idempotencyLevel != null && message.hasOwnProperty("idempotencyLevel"))
                        switch (message.idempotencyLevel) {
                        default:
                            return "idempotencyLevel: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.features != null && message.hasOwnProperty("features")) {
                        var error = $root.google.protobuf.FeatureSet.verify(message.features);
                        if (error)
                            return "features." + error;
                    }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.http"] != null && message.hasOwnProperty(".google.api.http")) {
                        var error = $root.google.api.HttpRule.verify(message[".google.api.http"]);
                        if (error)
                            return ".google.api.http." + error;
                    }
                    if (message[".google.api.methodSignature"] != null && message.hasOwnProperty(".google.api.methodSignature")) {
                        if (!Array.isArray(message[".google.api.methodSignature"]))
                            return ".google.api.methodSignature: array expected";
                        for (var i = 0; i < message[".google.api.methodSignature"].length; ++i)
                            if (!$util.isString(message[".google.api.methodSignature"][i]))
                                return ".google.api.methodSignature: string[] expected";
                    }
                    if (message[".google.longrunning.operationInfo"] != null && message.hasOwnProperty(".google.longrunning.operationInfo")) {
                        var error = $root.google.longrunning.OperationInfo.verify(message[".google.longrunning.operationInfo"]);
                        if (error)
                            return ".google.longrunning.operationInfo." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a MethodOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 */
                MethodOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MethodOptions)
                        return object;
                    var message = new $root.google.protobuf.MethodOptions();
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    switch (object.idempotencyLevel) {
                    default:
                        if (typeof object.idempotencyLevel === "number") {
                            message.idempotencyLevel = object.idempotencyLevel;
                            break;
                        }
                        break;
                    case "IDEMPOTENCY_UNKNOWN":
                    case 0:
                        message.idempotencyLevel = 0;
                        break;
                    case "NO_SIDE_EFFECTS":
                    case 1:
                        message.idempotencyLevel = 1;
                        break;
                    case "IDEMPOTENT":
                    case 2:
                        message.idempotencyLevel = 2;
                        break;
                    }
                    if (object.features != null) {
                        if (typeof object.features !== "object")
                            throw TypeError(".google.protobuf.MethodOptions.features: object expected");
                        message.features = $root.google.protobuf.FeatureSet.fromObject(object.features);
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.MethodOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.MethodOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.http"] != null) {
                        if (typeof object[".google.api.http"] !== "object")
                            throw TypeError(".google.protobuf.MethodOptions..google.api.http: object expected");
                        message[".google.api.http"] = $root.google.api.HttpRule.fromObject(object[".google.api.http"]);
                    }
                    if (object[".google.api.methodSignature"]) {
                        if (!Array.isArray(object[".google.api.methodSignature"]))
                            throw TypeError(".google.protobuf.MethodOptions..google.api.methodSignature: array expected");
                        message[".google.api.methodSignature"] = [];
                        for (var i = 0; i < object[".google.api.methodSignature"].length; ++i)
                            message[".google.api.methodSignature"][i] = String(object[".google.api.methodSignature"][i]);
                    }
                    if (object[".google.longrunning.operationInfo"] != null) {
                        if (typeof object[".google.longrunning.operationInfo"] !== "object")
                            throw TypeError(".google.protobuf.MethodOptions..google.longrunning.operationInfo: object expected");
                        message[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.fromObject(object[".google.longrunning.operationInfo"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MethodOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.MethodOptions} message MethodOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MethodOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.uninterpretedOption = [];
                        object[".google.api.methodSignature"] = [];
                    }
                    if (options.defaults) {
                        object.deprecated = false;
                        object.idempotencyLevel = options.enums === String ? "IDEMPOTENCY_UNKNOWN" : 0;
                        object.features = null;
                        object[".google.longrunning.operationInfo"] = null;
                        object[".google.api.http"] = null;
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.idempotencyLevel != null && message.hasOwnProperty("idempotencyLevel"))
                        object.idempotencyLevel = options.enums === String ? $root.google.protobuf.MethodOptions.IdempotencyLevel[message.idempotencyLevel] === undefined ? message.idempotencyLevel : $root.google.protobuf.MethodOptions.IdempotencyLevel[message.idempotencyLevel] : message.idempotencyLevel;
                    if (message.features != null && message.hasOwnProperty("features"))
                        object.features = $root.google.protobuf.FeatureSet.toObject(message.features, options);
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.longrunning.operationInfo"] != null && message.hasOwnProperty(".google.longrunning.operationInfo"))
                        object[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.toObject(message[".google.longrunning.operationInfo"], options);
                    if (message[".google.api.methodSignature"] && message[".google.api.methodSignature"].length) {
                        object[".google.api.methodSignature"] = [];
                        for (var j = 0; j < message[".google.api.methodSignature"].length; ++j)
                            object[".google.api.methodSignature"][j] = message[".google.api.methodSignature"][j];
                    }
                    if (message[".google.api.http"] != null && message.hasOwnProperty(".google.api.http"))
                        object[".google.api.http"] = $root.google.api.HttpRule.toObject(message[".google.api.http"], options);
                    return object;
                };
    
                /**
                 * Converts this MethodOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MethodOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for MethodOptions
                 * @function getTypeUrl
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                MethodOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.MethodOptions";
                };
    
                /**
                 * IdempotencyLevel enum.
                 * @name google.protobuf.MethodOptions.IdempotencyLevel
                 * @enum {number}
                 * @property {number} IDEMPOTENCY_UNKNOWN=0 IDEMPOTENCY_UNKNOWN value
                 * @property {number} NO_SIDE_EFFECTS=1 NO_SIDE_EFFECTS value
                 * @property {number} IDEMPOTENT=2 IDEMPOTENT value
                 */
                MethodOptions.IdempotencyLevel = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "IDEMPOTENCY_UNKNOWN"] = 0;
                    values[valuesById[1] = "NO_SIDE_EFFECTS"] = 1;
                    values[valuesById[2] = "IDEMPOTENT"] = 2;
                    return values;
                })();
    
                return MethodOptions;
            })();
    
            protobuf.UninterpretedOption = (function() {
    
                /**
                 * Properties of an UninterpretedOption.
                 * @memberof google.protobuf
                 * @interface IUninterpretedOption
                 * @property {Array.<google.protobuf.UninterpretedOption.INamePart>|null} [name] UninterpretedOption name
                 * @property {string|null} [identifierValue] UninterpretedOption identifierValue
                 * @property {number|Long|null} [positiveIntValue] UninterpretedOption positiveIntValue
                 * @property {number|Long|null} [negativeIntValue] UninterpretedOption negativeIntValue
                 * @property {number|null} [doubleValue] UninterpretedOption doubleValue
                 * @property {Uint8Array|null} [stringValue] UninterpretedOption stringValue
                 * @property {string|null} [aggregateValue] UninterpretedOption aggregateValue
                 */
    
                /**
                 * Constructs a new UninterpretedOption.
                 * @memberof google.protobuf
                 * @classdesc Represents an UninterpretedOption.
                 * @implements IUninterpretedOption
                 * @constructor
                 * @param {google.protobuf.IUninterpretedOption=} [properties] Properties to set
                 */
                function UninterpretedOption(properties) {
                    this.name = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * UninterpretedOption name.
                 * @member {Array.<google.protobuf.UninterpretedOption.INamePart>} name
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.name = $util.emptyArray;
    
                /**
                 * UninterpretedOption identifierValue.
                 * @member {string} identifierValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.identifierValue = "";
    
                /**
                 * UninterpretedOption positiveIntValue.
                 * @member {number|Long} positiveIntValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.positiveIntValue = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
    
                /**
                 * UninterpretedOption negativeIntValue.
                 * @member {number|Long} negativeIntValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.negativeIntValue = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * UninterpretedOption doubleValue.
                 * @member {number} doubleValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.doubleValue = 0;
    
                /**
                 * UninterpretedOption stringValue.
                 * @member {Uint8Array} stringValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.stringValue = $util.newBuffer([]);
    
                /**
                 * UninterpretedOption aggregateValue.
                 * @member {string} aggregateValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.aggregateValue = "";
    
                /**
                 * Creates a new UninterpretedOption instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption=} [properties] Properties to set
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption instance
                 */
                UninterpretedOption.create = function create(properties) {
                    return new UninterpretedOption(properties);
                };
    
                /**
                 * Encodes the specified UninterpretedOption message. Does not implicitly {@link google.protobuf.UninterpretedOption.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption} message UninterpretedOption message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                UninterpretedOption.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && message.name.length)
                        for (var i = 0; i < message.name.length; ++i)
                            $root.google.protobuf.UninterpretedOption.NamePart.encode(message.name[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.identifierValue != null && Object.hasOwnProperty.call(message, "identifierValue"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.identifierValue);
                    if (message.positiveIntValue != null && Object.hasOwnProperty.call(message, "positiveIntValue"))
                        writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.positiveIntValue);
                    if (message.negativeIntValue != null && Object.hasOwnProperty.call(message, "negativeIntValue"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int64(message.negativeIntValue);
                    if (message.doubleValue != null && Object.hasOwnProperty.call(message, "doubleValue"))
                        writer.uint32(/* id 6, wireType 1 =*/49).double(message.doubleValue);
                    if (message.stringValue != null && Object.hasOwnProperty.call(message, "stringValue"))
                        writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.stringValue);
                    if (message.aggregateValue != null && Object.hasOwnProperty.call(message, "aggregateValue"))
                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.aggregateValue);
                    return writer;
                };
    
                /**
                 * Encodes the specified UninterpretedOption message, length delimited. Does not implicitly {@link google.protobuf.UninterpretedOption.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption} message UninterpretedOption message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                UninterpretedOption.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an UninterpretedOption message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                UninterpretedOption.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.UninterpretedOption();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 2: {
                                if (!(message.name && message.name.length))
                                    message.name = [];
                                message.name.push($root.google.protobuf.UninterpretedOption.NamePart.decode(reader, reader.uint32()));
                                break;
                            }
                        case 3: {
                                message.identifierValue = reader.string();
                                break;
                            }
                        case 4: {
                                message.positiveIntValue = reader.uint64();
                                break;
                            }
                        case 5: {
                                message.negativeIntValue = reader.int64();
                                break;
                            }
                        case 6: {
                                message.doubleValue = reader.double();
                                break;
                            }
                        case 7: {
                                message.stringValue = reader.bytes();
                                break;
                            }
                        case 8: {
                                message.aggregateValue = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an UninterpretedOption message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                UninterpretedOption.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an UninterpretedOption message.
                 * @function verify
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                UninterpretedOption.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name")) {
                        if (!Array.isArray(message.name))
                            return "name: array expected";
                        for (var i = 0; i < message.name.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.NamePart.verify(message.name[i]);
                            if (error)
                                return "name." + error;
                        }
                    }
                    if (message.identifierValue != null && message.hasOwnProperty("identifierValue"))
                        if (!$util.isString(message.identifierValue))
                            return "identifierValue: string expected";
                    if (message.positiveIntValue != null && message.hasOwnProperty("positiveIntValue"))
                        if (!$util.isInteger(message.positiveIntValue) && !(message.positiveIntValue && $util.isInteger(message.positiveIntValue.low) && $util.isInteger(message.positiveIntValue.high)))
                            return "positiveIntValue: integer|Long expected";
                    if (message.negativeIntValue != null && message.hasOwnProperty("negativeIntValue"))
                        if (!$util.isInteger(message.negativeIntValue) && !(message.negativeIntValue && $util.isInteger(message.negativeIntValue.low) && $util.isInteger(message.negativeIntValue.high)))
                            return "negativeIntValue: integer|Long expected";
                    if (message.doubleValue != null && message.hasOwnProperty("doubleValue"))
                        if (typeof message.doubleValue !== "number")
                            return "doubleValue: number expected";
                    if (message.stringValue != null && message.hasOwnProperty("stringValue"))
                        if (!(message.stringValue && typeof message.stringValue.length === "number" || $util.isString(message.stringValue)))
                            return "stringValue: buffer expected";
                    if (message.aggregateValue != null && message.hasOwnProperty("aggregateValue"))
                        if (!$util.isString(message.aggregateValue))
                            return "aggregateValue: string expected";
                    return null;
                };
    
                /**
                 * Creates an UninterpretedOption message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 */
                UninterpretedOption.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.UninterpretedOption)
                        return object;
                    var message = new $root.google.protobuf.UninterpretedOption();
                    if (object.name) {
                        if (!Array.isArray(object.name))
                            throw TypeError(".google.protobuf.UninterpretedOption.name: array expected");
                        message.name = [];
                        for (var i = 0; i < object.name.length; ++i) {
                            if (typeof object.name[i] !== "object")
                                throw TypeError(".google.protobuf.UninterpretedOption.name: object expected");
                            message.name[i] = $root.google.protobuf.UninterpretedOption.NamePart.fromObject(object.name[i]);
                        }
                    }
                    if (object.identifierValue != null)
                        message.identifierValue = String(object.identifierValue);
                    if (object.positiveIntValue != null)
                        if ($util.Long)
                            (message.positiveIntValue = $util.Long.fromValue(object.positiveIntValue)).unsigned = true;
                        else if (typeof object.positiveIntValue === "string")
                            message.positiveIntValue = parseInt(object.positiveIntValue, 10);
                        else if (typeof object.positiveIntValue === "number")
                            message.positiveIntValue = object.positiveIntValue;
                        else if (typeof object.positiveIntValue === "object")
                            message.positiveIntValue = new $util.LongBits(object.positiveIntValue.low >>> 0, object.positiveIntValue.high >>> 0).toNumber(true);
                    if (object.negativeIntValue != null)
                        if ($util.Long)
                            (message.negativeIntValue = $util.Long.fromValue(object.negativeIntValue)).unsigned = false;
                        else if (typeof object.negativeIntValue === "string")
                            message.negativeIntValue = parseInt(object.negativeIntValue, 10);
                        else if (typeof object.negativeIntValue === "number")
                            message.negativeIntValue = object.negativeIntValue;
                        else if (typeof object.negativeIntValue === "object")
                            message.negativeIntValue = new $util.LongBits(object.negativeIntValue.low >>> 0, object.negativeIntValue.high >>> 0).toNumber();
                    if (object.doubleValue != null)
                        message.doubleValue = Number(object.doubleValue);
                    if (object.stringValue != null)
                        if (typeof object.stringValue === "string")
                            $util.base64.decode(object.stringValue, message.stringValue = $util.newBuffer($util.base64.length(object.stringValue)), 0);
                        else if (object.stringValue.length >= 0)
                            message.stringValue = object.stringValue;
                    if (object.aggregateValue != null)
                        message.aggregateValue = String(object.aggregateValue);
                    return message;
                };
    
                /**
                 * Creates a plain object from an UninterpretedOption message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.UninterpretedOption} message UninterpretedOption
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                UninterpretedOption.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.name = [];
                    if (options.defaults) {
                        object.identifierValue = "";
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, true);
                            object.positiveIntValue = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.positiveIntValue = options.longs === String ? "0" : 0;
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.negativeIntValue = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.negativeIntValue = options.longs === String ? "0" : 0;
                        object.doubleValue = 0;
                        if (options.bytes === String)
                            object.stringValue = "";
                        else {
                            object.stringValue = [];
                            if (options.bytes !== Array)
                                object.stringValue = $util.newBuffer(object.stringValue);
                        }
                        object.aggregateValue = "";
                    }
                    if (message.name && message.name.length) {
                        object.name = [];
                        for (var j = 0; j < message.name.length; ++j)
                            object.name[j] = $root.google.protobuf.UninterpretedOption.NamePart.toObject(message.name[j], options);
                    }
                    if (message.identifierValue != null && message.hasOwnProperty("identifierValue"))
                        object.identifierValue = message.identifierValue;
                    if (message.positiveIntValue != null && message.hasOwnProperty("positiveIntValue"))
                        if (typeof message.positiveIntValue === "number")
                            object.positiveIntValue = options.longs === String ? String(message.positiveIntValue) : message.positiveIntValue;
                        else
                            object.positiveIntValue = options.longs === String ? $util.Long.prototype.toString.call(message.positiveIntValue) : options.longs === Number ? new $util.LongBits(message.positiveIntValue.low >>> 0, message.positiveIntValue.high >>> 0).toNumber(true) : message.positiveIntValue;
                    if (message.negativeIntValue != null && message.hasOwnProperty("negativeIntValue"))
                        if (typeof message.negativeIntValue === "number")
                            object.negativeIntValue = options.longs === String ? String(message.negativeIntValue) : message.negativeIntValue;
                        else
                            object.negativeIntValue = options.longs === String ? $util.Long.prototype.toString.call(message.negativeIntValue) : options.longs === Number ? new $util.LongBits(message.negativeIntValue.low >>> 0, message.negativeIntValue.high >>> 0).toNumber() : message.negativeIntValue;
                    if (message.doubleValue != null && message.hasOwnProperty("doubleValue"))
                        object.doubleValue = options.json && !isFinite(message.doubleValue) ? String(message.doubleValue) : message.doubleValue;
                    if (message.stringValue != null && message.hasOwnProperty("stringValue"))
                        object.stringValue = options.bytes === String ? $util.base64.encode(message.stringValue, 0, message.stringValue.length) : options.bytes === Array ? Array.prototype.slice.call(message.stringValue) : message.stringValue;
                    if (message.aggregateValue != null && message.hasOwnProperty("aggregateValue"))
                        object.aggregateValue = message.aggregateValue;
                    return object;
                };
    
                /**
                 * Converts this UninterpretedOption to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                UninterpretedOption.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for UninterpretedOption
                 * @function getTypeUrl
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                UninterpretedOption.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.UninterpretedOption";
                };
    
                UninterpretedOption.NamePart = (function() {
    
                    /**
                     * Properties of a NamePart.
                     * @memberof google.protobuf.UninterpretedOption
                     * @interface INamePart
                     * @property {string} namePart NamePart namePart
                     * @property {boolean} isExtension NamePart isExtension
                     */
    
                    /**
                     * Constructs a new NamePart.
                     * @memberof google.protobuf.UninterpretedOption
                     * @classdesc Represents a NamePart.
                     * @implements INamePart
                     * @constructor
                     * @param {google.protobuf.UninterpretedOption.INamePart=} [properties] Properties to set
                     */
                    function NamePart(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * NamePart namePart.
                     * @member {string} namePart
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     */
                    NamePart.prototype.namePart = "";
    
                    /**
                     * NamePart isExtension.
                     * @member {boolean} isExtension
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     */
                    NamePart.prototype.isExtension = false;
    
                    /**
                     * Creates a new NamePart instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart=} [properties] Properties to set
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart instance
                     */
                    NamePart.create = function create(properties) {
                        return new NamePart(properties);
                    };
    
                    /**
                     * Encodes the specified NamePart message. Does not implicitly {@link google.protobuf.UninterpretedOption.NamePart.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart} message NamePart message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    NamePart.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.namePart);
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isExtension);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified NamePart message, length delimited. Does not implicitly {@link google.protobuf.UninterpretedOption.NamePart.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart} message NamePart message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    NamePart.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a NamePart message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    NamePart.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.UninterpretedOption.NamePart();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.namePart = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.isExtension = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        if (!message.hasOwnProperty("namePart"))
                            throw $util.ProtocolError("missing required 'namePart'", { instance: message });
                        if (!message.hasOwnProperty("isExtension"))
                            throw $util.ProtocolError("missing required 'isExtension'", { instance: message });
                        return message;
                    };
    
                    /**
                     * Decodes a NamePart message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    NamePart.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a NamePart message.
                     * @function verify
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    NamePart.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (!$util.isString(message.namePart))
                            return "namePart: string expected";
                        if (typeof message.isExtension !== "boolean")
                            return "isExtension: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a NamePart message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     */
                    NamePart.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.UninterpretedOption.NamePart)
                            return object;
                        var message = new $root.google.protobuf.UninterpretedOption.NamePart();
                        if (object.namePart != null)
                            message.namePart = String(object.namePart);
                        if (object.isExtension != null)
                            message.isExtension = Boolean(object.isExtension);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a NamePart message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.NamePart} message NamePart
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    NamePart.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.namePart = "";
                            object.isExtension = false;
                        }
                        if (message.namePart != null && message.hasOwnProperty("namePart"))
                            object.namePart = message.namePart;
                        if (message.isExtension != null && message.hasOwnProperty("isExtension"))
                            object.isExtension = message.isExtension;
                        return object;
                    };
    
                    /**
                     * Converts this NamePart to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    NamePart.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for NamePart
                     * @function getTypeUrl
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    NamePart.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.UninterpretedOption.NamePart";
                    };
    
                    return NamePart;
                })();
    
                return UninterpretedOption;
            })();
    
            protobuf.FeatureSet = (function() {
    
                /**
                 * Properties of a FeatureSet.
                 * @memberof google.protobuf
                 * @interface IFeatureSet
                 * @property {google.protobuf.FeatureSet.FieldPresence|null} [fieldPresence] FeatureSet fieldPresence
                 * @property {google.protobuf.FeatureSet.EnumType|null} [enumType] FeatureSet enumType
                 * @property {google.protobuf.FeatureSet.RepeatedFieldEncoding|null} [repeatedFieldEncoding] FeatureSet repeatedFieldEncoding
                 * @property {google.protobuf.FeatureSet.Utf8Validation|null} [utf8Validation] FeatureSet utf8Validation
                 * @property {google.protobuf.FeatureSet.MessageEncoding|null} [messageEncoding] FeatureSet messageEncoding
                 * @property {google.protobuf.FeatureSet.JsonFormat|null} [jsonFormat] FeatureSet jsonFormat
                 * @property {google.protobuf.FeatureSet.EnforceNamingStyle|null} [enforceNamingStyle] FeatureSet enforceNamingStyle
                 * @property {google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility|null} [defaultSymbolVisibility] FeatureSet defaultSymbolVisibility
                 */
    
                /**
                 * Constructs a new FeatureSet.
                 * @memberof google.protobuf
                 * @classdesc Represents a FeatureSet.
                 * @implements IFeatureSet
                 * @constructor
                 * @param {google.protobuf.IFeatureSet=} [properties] Properties to set
                 */
                function FeatureSet(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FeatureSet fieldPresence.
                 * @member {google.protobuf.FeatureSet.FieldPresence} fieldPresence
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.fieldPresence = 0;
    
                /**
                 * FeatureSet enumType.
                 * @member {google.protobuf.FeatureSet.EnumType} enumType
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.enumType = 0;
    
                /**
                 * FeatureSet repeatedFieldEncoding.
                 * @member {google.protobuf.FeatureSet.RepeatedFieldEncoding} repeatedFieldEncoding
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.repeatedFieldEncoding = 0;
    
                /**
                 * FeatureSet utf8Validation.
                 * @member {google.protobuf.FeatureSet.Utf8Validation} utf8Validation
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.utf8Validation = 0;
    
                /**
                 * FeatureSet messageEncoding.
                 * @member {google.protobuf.FeatureSet.MessageEncoding} messageEncoding
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.messageEncoding = 0;
    
                /**
                 * FeatureSet jsonFormat.
                 * @member {google.protobuf.FeatureSet.JsonFormat} jsonFormat
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.jsonFormat = 0;
    
                /**
                 * FeatureSet enforceNamingStyle.
                 * @member {google.protobuf.FeatureSet.EnforceNamingStyle} enforceNamingStyle
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.enforceNamingStyle = 0;
    
                /**
                 * FeatureSet defaultSymbolVisibility.
                 * @member {google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility} defaultSymbolVisibility
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 */
                FeatureSet.prototype.defaultSymbolVisibility = 0;
    
                /**
                 * Creates a new FeatureSet instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {google.protobuf.IFeatureSet=} [properties] Properties to set
                 * @returns {google.protobuf.FeatureSet} FeatureSet instance
                 */
                FeatureSet.create = function create(properties) {
                    return new FeatureSet(properties);
                };
    
                /**
                 * Encodes the specified FeatureSet message. Does not implicitly {@link google.protobuf.FeatureSet.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {google.protobuf.IFeatureSet} message FeatureSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FeatureSet.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.fieldPresence != null && Object.hasOwnProperty.call(message, "fieldPresence"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.fieldPresence);
                    if (message.enumType != null && Object.hasOwnProperty.call(message, "enumType"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.enumType);
                    if (message.repeatedFieldEncoding != null && Object.hasOwnProperty.call(message, "repeatedFieldEncoding"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.repeatedFieldEncoding);
                    if (message.utf8Validation != null && Object.hasOwnProperty.call(message, "utf8Validation"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.utf8Validation);
                    if (message.messageEncoding != null && Object.hasOwnProperty.call(message, "messageEncoding"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int32(message.messageEncoding);
                    if (message.jsonFormat != null && Object.hasOwnProperty.call(message, "jsonFormat"))
                        writer.uint32(/* id 6, wireType 0 =*/48).int32(message.jsonFormat);
                    if (message.enforceNamingStyle != null && Object.hasOwnProperty.call(message, "enforceNamingStyle"))
                        writer.uint32(/* id 7, wireType 0 =*/56).int32(message.enforceNamingStyle);
                    if (message.defaultSymbolVisibility != null && Object.hasOwnProperty.call(message, "defaultSymbolVisibility"))
                        writer.uint32(/* id 8, wireType 0 =*/64).int32(message.defaultSymbolVisibility);
                    return writer;
                };
    
                /**
                 * Encodes the specified FeatureSet message, length delimited. Does not implicitly {@link google.protobuf.FeatureSet.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {google.protobuf.IFeatureSet} message FeatureSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FeatureSet.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FeatureSet message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FeatureSet} FeatureSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FeatureSet.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FeatureSet();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.fieldPresence = reader.int32();
                                break;
                            }
                        case 2: {
                                message.enumType = reader.int32();
                                break;
                            }
                        case 3: {
                                message.repeatedFieldEncoding = reader.int32();
                                break;
                            }
                        case 4: {
                                message.utf8Validation = reader.int32();
                                break;
                            }
                        case 5: {
                                message.messageEncoding = reader.int32();
                                break;
                            }
                        case 6: {
                                message.jsonFormat = reader.int32();
                                break;
                            }
                        case 7: {
                                message.enforceNamingStyle = reader.int32();
                                break;
                            }
                        case 8: {
                                message.defaultSymbolVisibility = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FeatureSet message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FeatureSet} FeatureSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FeatureSet.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FeatureSet message.
                 * @function verify
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FeatureSet.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.fieldPresence != null && message.hasOwnProperty("fieldPresence"))
                        switch (message.fieldPresence) {
                        default:
                            return "fieldPresence: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.enumType != null && message.hasOwnProperty("enumType"))
                        switch (message.enumType) {
                        default:
                            return "enumType: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.repeatedFieldEncoding != null && message.hasOwnProperty("repeatedFieldEncoding"))
                        switch (message.repeatedFieldEncoding) {
                        default:
                            return "repeatedFieldEncoding: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.utf8Validation != null && message.hasOwnProperty("utf8Validation"))
                        switch (message.utf8Validation) {
                        default:
                            return "utf8Validation: enum value expected";
                        case 0:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.messageEncoding != null && message.hasOwnProperty("messageEncoding"))
                        switch (message.messageEncoding) {
                        default:
                            return "messageEncoding: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.jsonFormat != null && message.hasOwnProperty("jsonFormat"))
                        switch (message.jsonFormat) {
                        default:
                            return "jsonFormat: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.enforceNamingStyle != null && message.hasOwnProperty("enforceNamingStyle"))
                        switch (message.enforceNamingStyle) {
                        default:
                            return "enforceNamingStyle: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.defaultSymbolVisibility != null && message.hasOwnProperty("defaultSymbolVisibility"))
                        switch (message.defaultSymbolVisibility) {
                        default:
                            return "defaultSymbolVisibility: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates a FeatureSet message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FeatureSet} FeatureSet
                 */
                FeatureSet.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FeatureSet)
                        return object;
                    var message = new $root.google.protobuf.FeatureSet();
                    switch (object.fieldPresence) {
                    default:
                        if (typeof object.fieldPresence === "number") {
                            message.fieldPresence = object.fieldPresence;
                            break;
                        }
                        break;
                    case "FIELD_PRESENCE_UNKNOWN":
                    case 0:
                        message.fieldPresence = 0;
                        break;
                    case "EXPLICIT":
                    case 1:
                        message.fieldPresence = 1;
                        break;
                    case "IMPLICIT":
                    case 2:
                        message.fieldPresence = 2;
                        break;
                    case "LEGACY_REQUIRED":
                    case 3:
                        message.fieldPresence = 3;
                        break;
                    }
                    switch (object.enumType) {
                    default:
                        if (typeof object.enumType === "number") {
                            message.enumType = object.enumType;
                            break;
                        }
                        break;
                    case "ENUM_TYPE_UNKNOWN":
                    case 0:
                        message.enumType = 0;
                        break;
                    case "OPEN":
                    case 1:
                        message.enumType = 1;
                        break;
                    case "CLOSED":
                    case 2:
                        message.enumType = 2;
                        break;
                    }
                    switch (object.repeatedFieldEncoding) {
                    default:
                        if (typeof object.repeatedFieldEncoding === "number") {
                            message.repeatedFieldEncoding = object.repeatedFieldEncoding;
                            break;
                        }
                        break;
                    case "REPEATED_FIELD_ENCODING_UNKNOWN":
                    case 0:
                        message.repeatedFieldEncoding = 0;
                        break;
                    case "PACKED":
                    case 1:
                        message.repeatedFieldEncoding = 1;
                        break;
                    case "EXPANDED":
                    case 2:
                        message.repeatedFieldEncoding = 2;
                        break;
                    }
                    switch (object.utf8Validation) {
                    default:
                        if (typeof object.utf8Validation === "number") {
                            message.utf8Validation = object.utf8Validation;
                            break;
                        }
                        break;
                    case "UTF8_VALIDATION_UNKNOWN":
                    case 0:
                        message.utf8Validation = 0;
                        break;
                    case "VERIFY":
                    case 2:
                        message.utf8Validation = 2;
                        break;
                    case "NONE":
                    case 3:
                        message.utf8Validation = 3;
                        break;
                    }
                    switch (object.messageEncoding) {
                    default:
                        if (typeof object.messageEncoding === "number") {
                            message.messageEncoding = object.messageEncoding;
                            break;
                        }
                        break;
                    case "MESSAGE_ENCODING_UNKNOWN":
                    case 0:
                        message.messageEncoding = 0;
                        break;
                    case "LENGTH_PREFIXED":
                    case 1:
                        message.messageEncoding = 1;
                        break;
                    case "DELIMITED":
                    case 2:
                        message.messageEncoding = 2;
                        break;
                    }
                    switch (object.jsonFormat) {
                    default:
                        if (typeof object.jsonFormat === "number") {
                            message.jsonFormat = object.jsonFormat;
                            break;
                        }
                        break;
                    case "JSON_FORMAT_UNKNOWN":
                    case 0:
                        message.jsonFormat = 0;
                        break;
                    case "ALLOW":
                    case 1:
                        message.jsonFormat = 1;
                        break;
                    case "LEGACY_BEST_EFFORT":
                    case 2:
                        message.jsonFormat = 2;
                        break;
                    }
                    switch (object.enforceNamingStyle) {
                    default:
                        if (typeof object.enforceNamingStyle === "number") {
                            message.enforceNamingStyle = object.enforceNamingStyle;
                            break;
                        }
                        break;
                    case "ENFORCE_NAMING_STYLE_UNKNOWN":
                    case 0:
                        message.enforceNamingStyle = 0;
                        break;
                    case "STYLE2024":
                    case 1:
                        message.enforceNamingStyle = 1;
                        break;
                    case "STYLE_LEGACY":
                    case 2:
                        message.enforceNamingStyle = 2;
                        break;
                    }
                    switch (object.defaultSymbolVisibility) {
                    default:
                        if (typeof object.defaultSymbolVisibility === "number") {
                            message.defaultSymbolVisibility = object.defaultSymbolVisibility;
                            break;
                        }
                        break;
                    case "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN":
                    case 0:
                        message.defaultSymbolVisibility = 0;
                        break;
                    case "EXPORT_ALL":
                    case 1:
                        message.defaultSymbolVisibility = 1;
                        break;
                    case "EXPORT_TOP_LEVEL":
                    case 2:
                        message.defaultSymbolVisibility = 2;
                        break;
                    case "LOCAL_ALL":
                    case 3:
                        message.defaultSymbolVisibility = 3;
                        break;
                    case "STRICT":
                    case 4:
                        message.defaultSymbolVisibility = 4;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FeatureSet message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {google.protobuf.FeatureSet} message FeatureSet
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FeatureSet.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.fieldPresence = options.enums === String ? "FIELD_PRESENCE_UNKNOWN" : 0;
                        object.enumType = options.enums === String ? "ENUM_TYPE_UNKNOWN" : 0;
                        object.repeatedFieldEncoding = options.enums === String ? "REPEATED_FIELD_ENCODING_UNKNOWN" : 0;
                        object.utf8Validation = options.enums === String ? "UTF8_VALIDATION_UNKNOWN" : 0;
                        object.messageEncoding = options.enums === String ? "MESSAGE_ENCODING_UNKNOWN" : 0;
                        object.jsonFormat = options.enums === String ? "JSON_FORMAT_UNKNOWN" : 0;
                        object.enforceNamingStyle = options.enums === String ? "ENFORCE_NAMING_STYLE_UNKNOWN" : 0;
                        object.defaultSymbolVisibility = options.enums === String ? "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN" : 0;
                    }
                    if (message.fieldPresence != null && message.hasOwnProperty("fieldPresence"))
                        object.fieldPresence = options.enums === String ? $root.google.protobuf.FeatureSet.FieldPresence[message.fieldPresence] === undefined ? message.fieldPresence : $root.google.protobuf.FeatureSet.FieldPresence[message.fieldPresence] : message.fieldPresence;
                    if (message.enumType != null && message.hasOwnProperty("enumType"))
                        object.enumType = options.enums === String ? $root.google.protobuf.FeatureSet.EnumType[message.enumType] === undefined ? message.enumType : $root.google.protobuf.FeatureSet.EnumType[message.enumType] : message.enumType;
                    if (message.repeatedFieldEncoding != null && message.hasOwnProperty("repeatedFieldEncoding"))
                        object.repeatedFieldEncoding = options.enums === String ? $root.google.protobuf.FeatureSet.RepeatedFieldEncoding[message.repeatedFieldEncoding] === undefined ? message.repeatedFieldEncoding : $root.google.protobuf.FeatureSet.RepeatedFieldEncoding[message.repeatedFieldEncoding] : message.repeatedFieldEncoding;
                    if (message.utf8Validation != null && message.hasOwnProperty("utf8Validation"))
                        object.utf8Validation = options.enums === String ? $root.google.protobuf.FeatureSet.Utf8Validation[message.utf8Validation] === undefined ? message.utf8Validation : $root.google.protobuf.FeatureSet.Utf8Validation[message.utf8Validation] : message.utf8Validation;
                    if (message.messageEncoding != null && message.hasOwnProperty("messageEncoding"))
                        object.messageEncoding = options.enums === String ? $root.google.protobuf.FeatureSet.MessageEncoding[message.messageEncoding] === undefined ? message.messageEncoding : $root.google.protobuf.FeatureSet.MessageEncoding[message.messageEncoding] : message.messageEncoding;
                    if (message.jsonFormat != null && message.hasOwnProperty("jsonFormat"))
                        object.jsonFormat = options.enums === String ? $root.google.protobuf.FeatureSet.JsonFormat[message.jsonFormat] === undefined ? message.jsonFormat : $root.google.protobuf.FeatureSet.JsonFormat[message.jsonFormat] : message.jsonFormat;
                    if (message.enforceNamingStyle != null && message.hasOwnProperty("enforceNamingStyle"))
                        object.enforceNamingStyle = options.enums === String ? $root.google.protobuf.FeatureSet.EnforceNamingStyle[message.enforceNamingStyle] === undefined ? message.enforceNamingStyle : $root.google.protobuf.FeatureSet.EnforceNamingStyle[message.enforceNamingStyle] : message.enforceNamingStyle;
                    if (message.defaultSymbolVisibility != null && message.hasOwnProperty("defaultSymbolVisibility"))
                        object.defaultSymbolVisibility = options.enums === String ? $root.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility[message.defaultSymbolVisibility] === undefined ? message.defaultSymbolVisibility : $root.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility[message.defaultSymbolVisibility] : message.defaultSymbolVisibility;
                    return object;
                };
    
                /**
                 * Converts this FeatureSet to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FeatureSet
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FeatureSet.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FeatureSet
                 * @function getTypeUrl
                 * @memberof google.protobuf.FeatureSet
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FeatureSet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FeatureSet";
                };
    
                /**
                 * FieldPresence enum.
                 * @name google.protobuf.FeatureSet.FieldPresence
                 * @enum {number}
                 * @property {number} FIELD_PRESENCE_UNKNOWN=0 FIELD_PRESENCE_UNKNOWN value
                 * @property {number} EXPLICIT=1 EXPLICIT value
                 * @property {number} IMPLICIT=2 IMPLICIT value
                 * @property {number} LEGACY_REQUIRED=3 LEGACY_REQUIRED value
                 */
                FeatureSet.FieldPresence = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "FIELD_PRESENCE_UNKNOWN"] = 0;
                    values[valuesById[1] = "EXPLICIT"] = 1;
                    values[valuesById[2] = "IMPLICIT"] = 2;
                    values[valuesById[3] = "LEGACY_REQUIRED"] = 3;
                    return values;
                })();
    
                /**
                 * EnumType enum.
                 * @name google.protobuf.FeatureSet.EnumType
                 * @enum {number}
                 * @property {number} ENUM_TYPE_UNKNOWN=0 ENUM_TYPE_UNKNOWN value
                 * @property {number} OPEN=1 OPEN value
                 * @property {number} CLOSED=2 CLOSED value
                 */
                FeatureSet.EnumType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "ENUM_TYPE_UNKNOWN"] = 0;
                    values[valuesById[1] = "OPEN"] = 1;
                    values[valuesById[2] = "CLOSED"] = 2;
                    return values;
                })();
    
                /**
                 * RepeatedFieldEncoding enum.
                 * @name google.protobuf.FeatureSet.RepeatedFieldEncoding
                 * @enum {number}
                 * @property {number} REPEATED_FIELD_ENCODING_UNKNOWN=0 REPEATED_FIELD_ENCODING_UNKNOWN value
                 * @property {number} PACKED=1 PACKED value
                 * @property {number} EXPANDED=2 EXPANDED value
                 */
                FeatureSet.RepeatedFieldEncoding = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "REPEATED_FIELD_ENCODING_UNKNOWN"] = 0;
                    values[valuesById[1] = "PACKED"] = 1;
                    values[valuesById[2] = "EXPANDED"] = 2;
                    return values;
                })();
    
                /**
                 * Utf8Validation enum.
                 * @name google.protobuf.FeatureSet.Utf8Validation
                 * @enum {number}
                 * @property {number} UTF8_VALIDATION_UNKNOWN=0 UTF8_VALIDATION_UNKNOWN value
                 * @property {number} VERIFY=2 VERIFY value
                 * @property {number} NONE=3 NONE value
                 */
                FeatureSet.Utf8Validation = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "UTF8_VALIDATION_UNKNOWN"] = 0;
                    values[valuesById[2] = "VERIFY"] = 2;
                    values[valuesById[3] = "NONE"] = 3;
                    return values;
                })();
    
                /**
                 * MessageEncoding enum.
                 * @name google.protobuf.FeatureSet.MessageEncoding
                 * @enum {number}
                 * @property {number} MESSAGE_ENCODING_UNKNOWN=0 MESSAGE_ENCODING_UNKNOWN value
                 * @property {number} LENGTH_PREFIXED=1 LENGTH_PREFIXED value
                 * @property {number} DELIMITED=2 DELIMITED value
                 */
                FeatureSet.MessageEncoding = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "MESSAGE_ENCODING_UNKNOWN"] = 0;
                    values[valuesById[1] = "LENGTH_PREFIXED"] = 1;
                    values[valuesById[2] = "DELIMITED"] = 2;
                    return values;
                })();
    
                /**
                 * JsonFormat enum.
                 * @name google.protobuf.FeatureSet.JsonFormat
                 * @enum {number}
                 * @property {number} JSON_FORMAT_UNKNOWN=0 JSON_FORMAT_UNKNOWN value
                 * @property {number} ALLOW=1 ALLOW value
                 * @property {number} LEGACY_BEST_EFFORT=2 LEGACY_BEST_EFFORT value
                 */
                FeatureSet.JsonFormat = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "JSON_FORMAT_UNKNOWN"] = 0;
                    values[valuesById[1] = "ALLOW"] = 1;
                    values[valuesById[2] = "LEGACY_BEST_EFFORT"] = 2;
                    return values;
                })();
    
                /**
                 * EnforceNamingStyle enum.
                 * @name google.protobuf.FeatureSet.EnforceNamingStyle
                 * @enum {number}
                 * @property {number} ENFORCE_NAMING_STYLE_UNKNOWN=0 ENFORCE_NAMING_STYLE_UNKNOWN value
                 * @property {number} STYLE2024=1 STYLE2024 value
                 * @property {number} STYLE_LEGACY=2 STYLE_LEGACY value
                 */
                FeatureSet.EnforceNamingStyle = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "ENFORCE_NAMING_STYLE_UNKNOWN"] = 0;
                    values[valuesById[1] = "STYLE2024"] = 1;
                    values[valuesById[2] = "STYLE_LEGACY"] = 2;
                    return values;
                })();
    
                FeatureSet.VisibilityFeature = (function() {
    
                    /**
                     * Properties of a VisibilityFeature.
                     * @memberof google.protobuf.FeatureSet
                     * @interface IVisibilityFeature
                     */
    
                    /**
                     * Constructs a new VisibilityFeature.
                     * @memberof google.protobuf.FeatureSet
                     * @classdesc Represents a VisibilityFeature.
                     * @implements IVisibilityFeature
                     * @constructor
                     * @param {google.protobuf.FeatureSet.IVisibilityFeature=} [properties] Properties to set
                     */
                    function VisibilityFeature(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Creates a new VisibilityFeature instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {google.protobuf.FeatureSet.IVisibilityFeature=} [properties] Properties to set
                     * @returns {google.protobuf.FeatureSet.VisibilityFeature} VisibilityFeature instance
                     */
                    VisibilityFeature.create = function create(properties) {
                        return new VisibilityFeature(properties);
                    };
    
                    /**
                     * Encodes the specified VisibilityFeature message. Does not implicitly {@link google.protobuf.FeatureSet.VisibilityFeature.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {google.protobuf.FeatureSet.IVisibilityFeature} message VisibilityFeature message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    VisibilityFeature.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified VisibilityFeature message, length delimited. Does not implicitly {@link google.protobuf.FeatureSet.VisibilityFeature.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {google.protobuf.FeatureSet.IVisibilityFeature} message VisibilityFeature message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    VisibilityFeature.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a VisibilityFeature message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.FeatureSet.VisibilityFeature} VisibilityFeature
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    VisibilityFeature.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FeatureSet.VisibilityFeature();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a VisibilityFeature message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.FeatureSet.VisibilityFeature} VisibilityFeature
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    VisibilityFeature.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a VisibilityFeature message.
                     * @function verify
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    VisibilityFeature.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        return null;
                    };
    
                    /**
                     * Creates a VisibilityFeature message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.FeatureSet.VisibilityFeature} VisibilityFeature
                     */
                    VisibilityFeature.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.FeatureSet.VisibilityFeature)
                            return object;
                        return new $root.google.protobuf.FeatureSet.VisibilityFeature();
                    };
    
                    /**
                     * Creates a plain object from a VisibilityFeature message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {google.protobuf.FeatureSet.VisibilityFeature} message VisibilityFeature
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    VisibilityFeature.toObject = function toObject() {
                        return {};
                    };
    
                    /**
                     * Converts this VisibilityFeature to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    VisibilityFeature.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for VisibilityFeature
                     * @function getTypeUrl
                     * @memberof google.protobuf.FeatureSet.VisibilityFeature
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    VisibilityFeature.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.FeatureSet.VisibilityFeature";
                    };
    
                    /**
                     * DefaultSymbolVisibility enum.
                     * @name google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibility
                     * @enum {number}
                     * @property {number} DEFAULT_SYMBOL_VISIBILITY_UNKNOWN=0 DEFAULT_SYMBOL_VISIBILITY_UNKNOWN value
                     * @property {number} EXPORT_ALL=1 EXPORT_ALL value
                     * @property {number} EXPORT_TOP_LEVEL=2 EXPORT_TOP_LEVEL value
                     * @property {number} LOCAL_ALL=3 LOCAL_ALL value
                     * @property {number} STRICT=4 STRICT value
                     */
                    VisibilityFeature.DefaultSymbolVisibility = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN"] = 0;
                        values[valuesById[1] = "EXPORT_ALL"] = 1;
                        values[valuesById[2] = "EXPORT_TOP_LEVEL"] = 2;
                        values[valuesById[3] = "LOCAL_ALL"] = 3;
                        values[valuesById[4] = "STRICT"] = 4;
                        return values;
                    })();
    
                    return VisibilityFeature;
                })();
    
                return FeatureSet;
            })();
    
            protobuf.FeatureSetDefaults = (function() {
    
                /**
                 * Properties of a FeatureSetDefaults.
                 * @memberof google.protobuf
                 * @interface IFeatureSetDefaults
                 * @property {Array.<google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault>|null} [defaults] FeatureSetDefaults defaults
                 * @property {google.protobuf.Edition|null} [minimumEdition] FeatureSetDefaults minimumEdition
                 * @property {google.protobuf.Edition|null} [maximumEdition] FeatureSetDefaults maximumEdition
                 */
    
                /**
                 * Constructs a new FeatureSetDefaults.
                 * @memberof google.protobuf
                 * @classdesc Represents a FeatureSetDefaults.
                 * @implements IFeatureSetDefaults
                 * @constructor
                 * @param {google.protobuf.IFeatureSetDefaults=} [properties] Properties to set
                 */
                function FeatureSetDefaults(properties) {
                    this.defaults = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FeatureSetDefaults defaults.
                 * @member {Array.<google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault>} defaults
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @instance
                 */
                FeatureSetDefaults.prototype.defaults = $util.emptyArray;
    
                /**
                 * FeatureSetDefaults minimumEdition.
                 * @member {google.protobuf.Edition} minimumEdition
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @instance
                 */
                FeatureSetDefaults.prototype.minimumEdition = 0;
    
                /**
                 * FeatureSetDefaults maximumEdition.
                 * @member {google.protobuf.Edition} maximumEdition
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @instance
                 */
                FeatureSetDefaults.prototype.maximumEdition = 0;
    
                /**
                 * Creates a new FeatureSetDefaults instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {google.protobuf.IFeatureSetDefaults=} [properties] Properties to set
                 * @returns {google.protobuf.FeatureSetDefaults} FeatureSetDefaults instance
                 */
                FeatureSetDefaults.create = function create(properties) {
                    return new FeatureSetDefaults(properties);
                };
    
                /**
                 * Encodes the specified FeatureSetDefaults message. Does not implicitly {@link google.protobuf.FeatureSetDefaults.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {google.protobuf.IFeatureSetDefaults} message FeatureSetDefaults message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FeatureSetDefaults.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.defaults != null && message.defaults.length)
                        for (var i = 0; i < message.defaults.length; ++i)
                            $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.encode(message.defaults[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.minimumEdition != null && Object.hasOwnProperty.call(message, "minimumEdition"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.minimumEdition);
                    if (message.maximumEdition != null && Object.hasOwnProperty.call(message, "maximumEdition"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int32(message.maximumEdition);
                    return writer;
                };
    
                /**
                 * Encodes the specified FeatureSetDefaults message, length delimited. Does not implicitly {@link google.protobuf.FeatureSetDefaults.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {google.protobuf.IFeatureSetDefaults} message FeatureSetDefaults message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FeatureSetDefaults.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FeatureSetDefaults message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FeatureSetDefaults} FeatureSetDefaults
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FeatureSetDefaults.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FeatureSetDefaults();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.defaults && message.defaults.length))
                                    message.defaults = [];
                                message.defaults.push($root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.decode(reader, reader.uint32()));
                                break;
                            }
                        case 4: {
                                message.minimumEdition = reader.int32();
                                break;
                            }
                        case 5: {
                                message.maximumEdition = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FeatureSetDefaults message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FeatureSetDefaults} FeatureSetDefaults
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FeatureSetDefaults.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FeatureSetDefaults message.
                 * @function verify
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FeatureSetDefaults.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.defaults != null && message.hasOwnProperty("defaults")) {
                        if (!Array.isArray(message.defaults))
                            return "defaults: array expected";
                        for (var i = 0; i < message.defaults.length; ++i) {
                            var error = $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.verify(message.defaults[i]);
                            if (error)
                                return "defaults." + error;
                        }
                    }
                    if (message.minimumEdition != null && message.hasOwnProperty("minimumEdition"))
                        switch (message.minimumEdition) {
                        default:
                            return "minimumEdition: enum value expected";
                        case 0:
                        case 900:
                        case 998:
                        case 999:
                        case 1000:
                        case 1001:
                        case 1:
                        case 2:
                        case 99997:
                        case 99998:
                        case 99999:
                        case 2147483647:
                            break;
                        }
                    if (message.maximumEdition != null && message.hasOwnProperty("maximumEdition"))
                        switch (message.maximumEdition) {
                        default:
                            return "maximumEdition: enum value expected";
                        case 0:
                        case 900:
                        case 998:
                        case 999:
                        case 1000:
                        case 1001:
                        case 1:
                        case 2:
                        case 99997:
                        case 99998:
                        case 99999:
                        case 2147483647:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates a FeatureSetDefaults message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FeatureSetDefaults} FeatureSetDefaults
                 */
                FeatureSetDefaults.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FeatureSetDefaults)
                        return object;
                    var message = new $root.google.protobuf.FeatureSetDefaults();
                    if (object.defaults) {
                        if (!Array.isArray(object.defaults))
                            throw TypeError(".google.protobuf.FeatureSetDefaults.defaults: array expected");
                        message.defaults = [];
                        for (var i = 0; i < object.defaults.length; ++i) {
                            if (typeof object.defaults[i] !== "object")
                                throw TypeError(".google.protobuf.FeatureSetDefaults.defaults: object expected");
                            message.defaults[i] = $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.fromObject(object.defaults[i]);
                        }
                    }
                    switch (object.minimumEdition) {
                    default:
                        if (typeof object.minimumEdition === "number") {
                            message.minimumEdition = object.minimumEdition;
                            break;
                        }
                        break;
                    case "EDITION_UNKNOWN":
                    case 0:
                        message.minimumEdition = 0;
                        break;
                    case "EDITION_LEGACY":
                    case 900:
                        message.minimumEdition = 900;
                        break;
                    case "EDITION_PROTO2":
                    case 998:
                        message.minimumEdition = 998;
                        break;
                    case "EDITION_PROTO3":
                    case 999:
                        message.minimumEdition = 999;
                        break;
                    case "EDITION_2023":
                    case 1000:
                        message.minimumEdition = 1000;
                        break;
                    case "EDITION_2024":
                    case 1001:
                        message.minimumEdition = 1001;
                        break;
                    case "EDITION_1_TEST_ONLY":
                    case 1:
                        message.minimumEdition = 1;
                        break;
                    case "EDITION_2_TEST_ONLY":
                    case 2:
                        message.minimumEdition = 2;
                        break;
                    case "EDITION_99997_TEST_ONLY":
                    case 99997:
                        message.minimumEdition = 99997;
                        break;
                    case "EDITION_99998_TEST_ONLY":
                    case 99998:
                        message.minimumEdition = 99998;
                        break;
                    case "EDITION_99999_TEST_ONLY":
                    case 99999:
                        message.minimumEdition = 99999;
                        break;
                    case "EDITION_MAX":
                    case 2147483647:
                        message.minimumEdition = 2147483647;
                        break;
                    }
                    switch (object.maximumEdition) {
                    default:
                        if (typeof object.maximumEdition === "number") {
                            message.maximumEdition = object.maximumEdition;
                            break;
                        }
                        break;
                    case "EDITION_UNKNOWN":
                    case 0:
                        message.maximumEdition = 0;
                        break;
                    case "EDITION_LEGACY":
                    case 900:
                        message.maximumEdition = 900;
                        break;
                    case "EDITION_PROTO2":
                    case 998:
                        message.maximumEdition = 998;
                        break;
                    case "EDITION_PROTO3":
                    case 999:
                        message.maximumEdition = 999;
                        break;
                    case "EDITION_2023":
                    case 1000:
                        message.maximumEdition = 1000;
                        break;
                    case "EDITION_2024":
                    case 1001:
                        message.maximumEdition = 1001;
                        break;
                    case "EDITION_1_TEST_ONLY":
                    case 1:
                        message.maximumEdition = 1;
                        break;
                    case "EDITION_2_TEST_ONLY":
                    case 2:
                        message.maximumEdition = 2;
                        break;
                    case "EDITION_99997_TEST_ONLY":
                    case 99997:
                        message.maximumEdition = 99997;
                        break;
                    case "EDITION_99998_TEST_ONLY":
                    case 99998:
                        message.maximumEdition = 99998;
                        break;
                    case "EDITION_99999_TEST_ONLY":
                    case 99999:
                        message.maximumEdition = 99999;
                        break;
                    case "EDITION_MAX":
                    case 2147483647:
                        message.maximumEdition = 2147483647;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FeatureSetDefaults message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {google.protobuf.FeatureSetDefaults} message FeatureSetDefaults
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FeatureSetDefaults.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.defaults = [];
                    if (options.defaults) {
                        object.minimumEdition = options.enums === String ? "EDITION_UNKNOWN" : 0;
                        object.maximumEdition = options.enums === String ? "EDITION_UNKNOWN" : 0;
                    }
                    if (message.defaults && message.defaults.length) {
                        object.defaults = [];
                        for (var j = 0; j < message.defaults.length; ++j)
                            object.defaults[j] = $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.toObject(message.defaults[j], options);
                    }
                    if (message.minimumEdition != null && message.hasOwnProperty("minimumEdition"))
                        object.minimumEdition = options.enums === String ? $root.google.protobuf.Edition[message.minimumEdition] === undefined ? message.minimumEdition : $root.google.protobuf.Edition[message.minimumEdition] : message.minimumEdition;
                    if (message.maximumEdition != null && message.hasOwnProperty("maximumEdition"))
                        object.maximumEdition = options.enums === String ? $root.google.protobuf.Edition[message.maximumEdition] === undefined ? message.maximumEdition : $root.google.protobuf.Edition[message.maximumEdition] : message.maximumEdition;
                    return object;
                };
    
                /**
                 * Converts this FeatureSetDefaults to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FeatureSetDefaults.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FeatureSetDefaults
                 * @function getTypeUrl
                 * @memberof google.protobuf.FeatureSetDefaults
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FeatureSetDefaults.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FeatureSetDefaults";
                };
    
                FeatureSetDefaults.FeatureSetEditionDefault = (function() {
    
                    /**
                     * Properties of a FeatureSetEditionDefault.
                     * @memberof google.protobuf.FeatureSetDefaults
                     * @interface IFeatureSetEditionDefault
                     * @property {google.protobuf.Edition|null} [edition] FeatureSetEditionDefault edition
                     * @property {google.protobuf.IFeatureSet|null} [overridableFeatures] FeatureSetEditionDefault overridableFeatures
                     * @property {google.protobuf.IFeatureSet|null} [fixedFeatures] FeatureSetEditionDefault fixedFeatures
                     */
    
                    /**
                     * Constructs a new FeatureSetEditionDefault.
                     * @memberof google.protobuf.FeatureSetDefaults
                     * @classdesc Represents a FeatureSetEditionDefault.
                     * @implements IFeatureSetEditionDefault
                     * @constructor
                     * @param {google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault=} [properties] Properties to set
                     */
                    function FeatureSetEditionDefault(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * FeatureSetEditionDefault edition.
                     * @member {google.protobuf.Edition} edition
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @instance
                     */
                    FeatureSetEditionDefault.prototype.edition = 0;
    
                    /**
                     * FeatureSetEditionDefault overridableFeatures.
                     * @member {google.protobuf.IFeatureSet|null|undefined} overridableFeatures
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @instance
                     */
                    FeatureSetEditionDefault.prototype.overridableFeatures = null;
    
                    /**
                     * FeatureSetEditionDefault fixedFeatures.
                     * @member {google.protobuf.IFeatureSet|null|undefined} fixedFeatures
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @instance
                     */
                    FeatureSetEditionDefault.prototype.fixedFeatures = null;
    
                    /**
                     * Creates a new FeatureSetEditionDefault instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault=} [properties] Properties to set
                     * @returns {google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault} FeatureSetEditionDefault instance
                     */
                    FeatureSetEditionDefault.create = function create(properties) {
                        return new FeatureSetEditionDefault(properties);
                    };
    
                    /**
                     * Encodes the specified FeatureSetEditionDefault message. Does not implicitly {@link google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault} message FeatureSetEditionDefault message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FeatureSetEditionDefault.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.edition != null && Object.hasOwnProperty.call(message, "edition"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.edition);
                        if (message.overridableFeatures != null && Object.hasOwnProperty.call(message, "overridableFeatures"))
                            $root.google.protobuf.FeatureSet.encode(message.overridableFeatures, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.fixedFeatures != null && Object.hasOwnProperty.call(message, "fixedFeatures"))
                            $root.google.protobuf.FeatureSet.encode(message.fixedFeatures, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified FeatureSetEditionDefault message, length delimited. Does not implicitly {@link google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {google.protobuf.FeatureSetDefaults.IFeatureSetEditionDefault} message FeatureSetEditionDefault message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FeatureSetEditionDefault.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a FeatureSetEditionDefault message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault} FeatureSetEditionDefault
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FeatureSetEditionDefault.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 3: {
                                    message.edition = reader.int32();
                                    break;
                                }
                            case 4: {
                                    message.overridableFeatures = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.fixedFeatures = $root.google.protobuf.FeatureSet.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a FeatureSetEditionDefault message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault} FeatureSetEditionDefault
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FeatureSetEditionDefault.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a FeatureSetEditionDefault message.
                     * @function verify
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    FeatureSetEditionDefault.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.edition != null && message.hasOwnProperty("edition"))
                            switch (message.edition) {
                            default:
                                return "edition: enum value expected";
                            case 0:
                            case 900:
                            case 998:
                            case 999:
                            case 1000:
                            case 1001:
                            case 1:
                            case 2:
                            case 99997:
                            case 99998:
                            case 99999:
                            case 2147483647:
                                break;
                            }
                        if (message.overridableFeatures != null && message.hasOwnProperty("overridableFeatures")) {
                            var error = $root.google.protobuf.FeatureSet.verify(message.overridableFeatures);
                            if (error)
                                return "overridableFeatures." + error;
                        }
                        if (message.fixedFeatures != null && message.hasOwnProperty("fixedFeatures")) {
                            var error = $root.google.protobuf.FeatureSet.verify(message.fixedFeatures);
                            if (error)
                                return "fixedFeatures." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a FeatureSetEditionDefault message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault} FeatureSetEditionDefault
                     */
                    FeatureSetEditionDefault.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault)
                            return object;
                        var message = new $root.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault();
                        switch (object.edition) {
                        default:
                            if (typeof object.edition === "number") {
                                message.edition = object.edition;
                                break;
                            }
                            break;
                        case "EDITION_UNKNOWN":
                        case 0:
                            message.edition = 0;
                            break;
                        case "EDITION_LEGACY":
                        case 900:
                            message.edition = 900;
                            break;
                        case "EDITION_PROTO2":
                        case 998:
                            message.edition = 998;
                            break;
                        case "EDITION_PROTO3":
                        case 999:
                            message.edition = 999;
                            break;
                        case "EDITION_2023":
                        case 1000:
                            message.edition = 1000;
                            break;
                        case "EDITION_2024":
                        case 1001:
                            message.edition = 1001;
                            break;
                        case "EDITION_1_TEST_ONLY":
                        case 1:
                            message.edition = 1;
                            break;
                        case "EDITION_2_TEST_ONLY":
                        case 2:
                            message.edition = 2;
                            break;
                        case "EDITION_99997_TEST_ONLY":
                        case 99997:
                            message.edition = 99997;
                            break;
                        case "EDITION_99998_TEST_ONLY":
                        case 99998:
                            message.edition = 99998;
                            break;
                        case "EDITION_99999_TEST_ONLY":
                        case 99999:
                            message.edition = 99999;
                            break;
                        case "EDITION_MAX":
                        case 2147483647:
                            message.edition = 2147483647;
                            break;
                        }
                        if (object.overridableFeatures != null) {
                            if (typeof object.overridableFeatures !== "object")
                                throw TypeError(".google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.overridableFeatures: object expected");
                            message.overridableFeatures = $root.google.protobuf.FeatureSet.fromObject(object.overridableFeatures);
                        }
                        if (object.fixedFeatures != null) {
                            if (typeof object.fixedFeatures !== "object")
                                throw TypeError(".google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.fixedFeatures: object expected");
                            message.fixedFeatures = $root.google.protobuf.FeatureSet.fromObject(object.fixedFeatures);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a FeatureSetEditionDefault message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault} message FeatureSetEditionDefault
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    FeatureSetEditionDefault.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.edition = options.enums === String ? "EDITION_UNKNOWN" : 0;
                            object.overridableFeatures = null;
                            object.fixedFeatures = null;
                        }
                        if (message.edition != null && message.hasOwnProperty("edition"))
                            object.edition = options.enums === String ? $root.google.protobuf.Edition[message.edition] === undefined ? message.edition : $root.google.protobuf.Edition[message.edition] : message.edition;
                        if (message.overridableFeatures != null && message.hasOwnProperty("overridableFeatures"))
                            object.overridableFeatures = $root.google.protobuf.FeatureSet.toObject(message.overridableFeatures, options);
                        if (message.fixedFeatures != null && message.hasOwnProperty("fixedFeatures"))
                            object.fixedFeatures = $root.google.protobuf.FeatureSet.toObject(message.fixedFeatures, options);
                        return object;
                    };
    
                    /**
                     * Converts this FeatureSetEditionDefault to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    FeatureSetEditionDefault.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for FeatureSetEditionDefault
                     * @function getTypeUrl
                     * @memberof google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    FeatureSetEditionDefault.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault";
                    };
    
                    return FeatureSetEditionDefault;
                })();
    
                return FeatureSetDefaults;
            })();
    
            protobuf.SourceCodeInfo = (function() {
    
                /**
                 * Properties of a SourceCodeInfo.
                 * @memberof google.protobuf
                 * @interface ISourceCodeInfo
                 * @property {Array.<google.protobuf.SourceCodeInfo.ILocation>|null} [location] SourceCodeInfo location
                 */
    
                /**
                 * Constructs a new SourceCodeInfo.
                 * @memberof google.protobuf
                 * @classdesc Represents a SourceCodeInfo.
                 * @implements ISourceCodeInfo
                 * @constructor
                 * @param {google.protobuf.ISourceCodeInfo=} [properties] Properties to set
                 */
                function SourceCodeInfo(properties) {
                    this.location = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * SourceCodeInfo location.
                 * @member {Array.<google.protobuf.SourceCodeInfo.ILocation>} location
                 * @memberof google.protobuf.SourceCodeInfo
                 * @instance
                 */
                SourceCodeInfo.prototype.location = $util.emptyArray;
    
                /**
                 * Creates a new SourceCodeInfo instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo=} [properties] Properties to set
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo instance
                 */
                SourceCodeInfo.create = function create(properties) {
                    return new SourceCodeInfo(properties);
                };
    
                /**
                 * Encodes the specified SourceCodeInfo message. Does not implicitly {@link google.protobuf.SourceCodeInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo} message SourceCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SourceCodeInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.location != null && message.location.length)
                        for (var i = 0; i < message.location.length; ++i)
                            $root.google.protobuf.SourceCodeInfo.Location.encode(message.location[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified SourceCodeInfo message, length delimited. Does not implicitly {@link google.protobuf.SourceCodeInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo} message SourceCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SourceCodeInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a SourceCodeInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SourceCodeInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.SourceCodeInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.location && message.location.length))
                                    message.location = [];
                                message.location.push($root.google.protobuf.SourceCodeInfo.Location.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a SourceCodeInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SourceCodeInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a SourceCodeInfo message.
                 * @function verify
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                SourceCodeInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.location != null && message.hasOwnProperty("location")) {
                        if (!Array.isArray(message.location))
                            return "location: array expected";
                        for (var i = 0; i < message.location.length; ++i) {
                            var error = $root.google.protobuf.SourceCodeInfo.Location.verify(message.location[i]);
                            if (error)
                                return "location." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a SourceCodeInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 */
                SourceCodeInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.SourceCodeInfo)
                        return object;
                    var message = new $root.google.protobuf.SourceCodeInfo();
                    if (object.location) {
                        if (!Array.isArray(object.location))
                            throw TypeError(".google.protobuf.SourceCodeInfo.location: array expected");
                        message.location = [];
                        for (var i = 0; i < object.location.length; ++i) {
                            if (typeof object.location[i] !== "object")
                                throw TypeError(".google.protobuf.SourceCodeInfo.location: object expected");
                            message.location[i] = $root.google.protobuf.SourceCodeInfo.Location.fromObject(object.location[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a SourceCodeInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.SourceCodeInfo} message SourceCodeInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                SourceCodeInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.location = [];
                    if (message.location && message.location.length) {
                        object.location = [];
                        for (var j = 0; j < message.location.length; ++j)
                            object.location[j] = $root.google.protobuf.SourceCodeInfo.Location.toObject(message.location[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this SourceCodeInfo to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.SourceCodeInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                SourceCodeInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for SourceCodeInfo
                 * @function getTypeUrl
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                SourceCodeInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.SourceCodeInfo";
                };
    
                SourceCodeInfo.Location = (function() {
    
                    /**
                     * Properties of a Location.
                     * @memberof google.protobuf.SourceCodeInfo
                     * @interface ILocation
                     * @property {Array.<number>|null} [path] Location path
                     * @property {Array.<number>|null} [span] Location span
                     * @property {string|null} [leadingComments] Location leadingComments
                     * @property {string|null} [trailingComments] Location trailingComments
                     * @property {Array.<string>|null} [leadingDetachedComments] Location leadingDetachedComments
                     */
    
                    /**
                     * Constructs a new Location.
                     * @memberof google.protobuf.SourceCodeInfo
                     * @classdesc Represents a Location.
                     * @implements ILocation
                     * @constructor
                     * @param {google.protobuf.SourceCodeInfo.ILocation=} [properties] Properties to set
                     */
                    function Location(properties) {
                        this.path = [];
                        this.span = [];
                        this.leadingDetachedComments = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Location path.
                     * @member {Array.<number>} path
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.path = $util.emptyArray;
    
                    /**
                     * Location span.
                     * @member {Array.<number>} span
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.span = $util.emptyArray;
    
                    /**
                     * Location leadingComments.
                     * @member {string} leadingComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.leadingComments = "";
    
                    /**
                     * Location trailingComments.
                     * @member {string} trailingComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.trailingComments = "";
    
                    /**
                     * Location leadingDetachedComments.
                     * @member {Array.<string>} leadingDetachedComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.leadingDetachedComments = $util.emptyArray;
    
                    /**
                     * Creates a new Location instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation=} [properties] Properties to set
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location instance
                     */
                    Location.create = function create(properties) {
                        return new Location(properties);
                    };
    
                    /**
                     * Encodes the specified Location message. Does not implicitly {@link google.protobuf.SourceCodeInfo.Location.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation} message Location message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Location.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.path != null && message.path.length) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork();
                            for (var i = 0; i < message.path.length; ++i)
                                writer.int32(message.path[i]);
                            writer.ldelim();
                        }
                        if (message.span != null && message.span.length) {
                            writer.uint32(/* id 2, wireType 2 =*/18).fork();
                            for (var i = 0; i < message.span.length; ++i)
                                writer.int32(message.span[i]);
                            writer.ldelim();
                        }
                        if (message.leadingComments != null && Object.hasOwnProperty.call(message, "leadingComments"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.leadingComments);
                        if (message.trailingComments != null && Object.hasOwnProperty.call(message, "trailingComments"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.trailingComments);
                        if (message.leadingDetachedComments != null && message.leadingDetachedComments.length)
                            for (var i = 0; i < message.leadingDetachedComments.length; ++i)
                                writer.uint32(/* id 6, wireType 2 =*/50).string(message.leadingDetachedComments[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Location message, length delimited. Does not implicitly {@link google.protobuf.SourceCodeInfo.Location.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation} message Location message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Location.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Location message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Location.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.SourceCodeInfo.Location();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.path && message.path.length))
                                        message.path = [];
                                    if ((tag & 7) === 2) {
                                        var end2 = reader.uint32() + reader.pos;
                                        while (reader.pos < end2)
                                            message.path.push(reader.int32());
                                    } else
                                        message.path.push(reader.int32());
                                    break;
                                }
                            case 2: {
                                    if (!(message.span && message.span.length))
                                        message.span = [];
                                    if ((tag & 7) === 2) {
                                        var end2 = reader.uint32() + reader.pos;
                                        while (reader.pos < end2)
                                            message.span.push(reader.int32());
                                    } else
                                        message.span.push(reader.int32());
                                    break;
                                }
                            case 3: {
                                    message.leadingComments = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.trailingComments = reader.string();
                                    break;
                                }
                            case 6: {
                                    if (!(message.leadingDetachedComments && message.leadingDetachedComments.length))
                                        message.leadingDetachedComments = [];
                                    message.leadingDetachedComments.push(reader.string());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Location message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Location.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Location message.
                     * @function verify
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Location.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.path != null && message.hasOwnProperty("path")) {
                            if (!Array.isArray(message.path))
                                return "path: array expected";
                            for (var i = 0; i < message.path.length; ++i)
                                if (!$util.isInteger(message.path[i]))
                                    return "path: integer[] expected";
                        }
                        if (message.span != null && message.hasOwnProperty("span")) {
                            if (!Array.isArray(message.span))
                                return "span: array expected";
                            for (var i = 0; i < message.span.length; ++i)
                                if (!$util.isInteger(message.span[i]))
                                    return "span: integer[] expected";
                        }
                        if (message.leadingComments != null && message.hasOwnProperty("leadingComments"))
                            if (!$util.isString(message.leadingComments))
                                return "leadingComments: string expected";
                        if (message.trailingComments != null && message.hasOwnProperty("trailingComments"))
                            if (!$util.isString(message.trailingComments))
                                return "trailingComments: string expected";
                        if (message.leadingDetachedComments != null && message.hasOwnProperty("leadingDetachedComments")) {
                            if (!Array.isArray(message.leadingDetachedComments))
                                return "leadingDetachedComments: array expected";
                            for (var i = 0; i < message.leadingDetachedComments.length; ++i)
                                if (!$util.isString(message.leadingDetachedComments[i]))
                                    return "leadingDetachedComments: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Location message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     */
                    Location.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.SourceCodeInfo.Location)
                            return object;
                        var message = new $root.google.protobuf.SourceCodeInfo.Location();
                        if (object.path) {
                            if (!Array.isArray(object.path))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.path: array expected");
                            message.path = [];
                            for (var i = 0; i < object.path.length; ++i)
                                message.path[i] = object.path[i] | 0;
                        }
                        if (object.span) {
                            if (!Array.isArray(object.span))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.span: array expected");
                            message.span = [];
                            for (var i = 0; i < object.span.length; ++i)
                                message.span[i] = object.span[i] | 0;
                        }
                        if (object.leadingComments != null)
                            message.leadingComments = String(object.leadingComments);
                        if (object.trailingComments != null)
                            message.trailingComments = String(object.trailingComments);
                        if (object.leadingDetachedComments) {
                            if (!Array.isArray(object.leadingDetachedComments))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.leadingDetachedComments: array expected");
                            message.leadingDetachedComments = [];
                            for (var i = 0; i < object.leadingDetachedComments.length; ++i)
                                message.leadingDetachedComments[i] = String(object.leadingDetachedComments[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Location message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.Location} message Location
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Location.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.path = [];
                            object.span = [];
                            object.leadingDetachedComments = [];
                        }
                        if (options.defaults) {
                            object.leadingComments = "";
                            object.trailingComments = "";
                        }
                        if (message.path && message.path.length) {
                            object.path = [];
                            for (var j = 0; j < message.path.length; ++j)
                                object.path[j] = message.path[j];
                        }
                        if (message.span && message.span.length) {
                            object.span = [];
                            for (var j = 0; j < message.span.length; ++j)
                                object.span[j] = message.span[j];
                        }
                        if (message.leadingComments != null && message.hasOwnProperty("leadingComments"))
                            object.leadingComments = message.leadingComments;
                        if (message.trailingComments != null && message.hasOwnProperty("trailingComments"))
                            object.trailingComments = message.trailingComments;
                        if (message.leadingDetachedComments && message.leadingDetachedComments.length) {
                            object.leadingDetachedComments = [];
                            for (var j = 0; j < message.leadingDetachedComments.length; ++j)
                                object.leadingDetachedComments[j] = message.leadingDetachedComments[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Location to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Location.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Location
                     * @function getTypeUrl
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Location.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.SourceCodeInfo.Location";
                    };
    
                    return Location;
                })();
    
                return SourceCodeInfo;
            })();
    
            protobuf.GeneratedCodeInfo = (function() {
    
                /**
                 * Properties of a GeneratedCodeInfo.
                 * @memberof google.protobuf
                 * @interface IGeneratedCodeInfo
                 * @property {Array.<google.protobuf.GeneratedCodeInfo.IAnnotation>|null} [annotation] GeneratedCodeInfo annotation
                 */
    
                /**
                 * Constructs a new GeneratedCodeInfo.
                 * @memberof google.protobuf
                 * @classdesc Represents a GeneratedCodeInfo.
                 * @implements IGeneratedCodeInfo
                 * @constructor
                 * @param {google.protobuf.IGeneratedCodeInfo=} [properties] Properties to set
                 */
                function GeneratedCodeInfo(properties) {
                    this.annotation = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * GeneratedCodeInfo annotation.
                 * @member {Array.<google.protobuf.GeneratedCodeInfo.IAnnotation>} annotation
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @instance
                 */
                GeneratedCodeInfo.prototype.annotation = $util.emptyArray;
    
                /**
                 * Creates a new GeneratedCodeInfo instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo=} [properties] Properties to set
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo instance
                 */
                GeneratedCodeInfo.create = function create(properties) {
                    return new GeneratedCodeInfo(properties);
                };
    
                /**
                 * Encodes the specified GeneratedCodeInfo message. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo} message GeneratedCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GeneratedCodeInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.annotation != null && message.annotation.length)
                        for (var i = 0; i < message.annotation.length; ++i)
                            $root.google.protobuf.GeneratedCodeInfo.Annotation.encode(message.annotation[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified GeneratedCodeInfo message, length delimited. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo} message GeneratedCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GeneratedCodeInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a GeneratedCodeInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GeneratedCodeInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.GeneratedCodeInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.annotation && message.annotation.length))
                                    message.annotation = [];
                                message.annotation.push($root.google.protobuf.GeneratedCodeInfo.Annotation.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a GeneratedCodeInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GeneratedCodeInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a GeneratedCodeInfo message.
                 * @function verify
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                GeneratedCodeInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.annotation != null && message.hasOwnProperty("annotation")) {
                        if (!Array.isArray(message.annotation))
                            return "annotation: array expected";
                        for (var i = 0; i < message.annotation.length; ++i) {
                            var error = $root.google.protobuf.GeneratedCodeInfo.Annotation.verify(message.annotation[i]);
                            if (error)
                                return "annotation." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a GeneratedCodeInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 */
                GeneratedCodeInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.GeneratedCodeInfo)
                        return object;
                    var message = new $root.google.protobuf.GeneratedCodeInfo();
                    if (object.annotation) {
                        if (!Array.isArray(object.annotation))
                            throw TypeError(".google.protobuf.GeneratedCodeInfo.annotation: array expected");
                        message.annotation = [];
                        for (var i = 0; i < object.annotation.length; ++i) {
                            if (typeof object.annotation[i] !== "object")
                                throw TypeError(".google.protobuf.GeneratedCodeInfo.annotation: object expected");
                            message.annotation[i] = $root.google.protobuf.GeneratedCodeInfo.Annotation.fromObject(object.annotation[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a GeneratedCodeInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.GeneratedCodeInfo} message GeneratedCodeInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                GeneratedCodeInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.annotation = [];
                    if (message.annotation && message.annotation.length) {
                        object.annotation = [];
                        for (var j = 0; j < message.annotation.length; ++j)
                            object.annotation[j] = $root.google.protobuf.GeneratedCodeInfo.Annotation.toObject(message.annotation[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this GeneratedCodeInfo to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                GeneratedCodeInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for GeneratedCodeInfo
                 * @function getTypeUrl
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                GeneratedCodeInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.GeneratedCodeInfo";
                };
    
                GeneratedCodeInfo.Annotation = (function() {
    
                    /**
                     * Properties of an Annotation.
                     * @memberof google.protobuf.GeneratedCodeInfo
                     * @interface IAnnotation
                     * @property {Array.<number>|null} [path] Annotation path
                     * @property {string|null} [sourceFile] Annotation sourceFile
                     * @property {number|null} [begin] Annotation begin
                     * @property {number|null} [end] Annotation end
                     * @property {google.protobuf.GeneratedCodeInfo.Annotation.Semantic|null} [semantic] Annotation semantic
                     */
    
                    /**
                     * Constructs a new Annotation.
                     * @memberof google.protobuf.GeneratedCodeInfo
                     * @classdesc Represents an Annotation.
                     * @implements IAnnotation
                     * @constructor
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation=} [properties] Properties to set
                     */
                    function Annotation(properties) {
                        this.path = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Annotation path.
                     * @member {Array.<number>} path
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.path = $util.emptyArray;
    
                    /**
                     * Annotation sourceFile.
                     * @member {string} sourceFile
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.sourceFile = "";
    
                    /**
                     * Annotation begin.
                     * @member {number} begin
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.begin = 0;
    
                    /**
                     * Annotation end.
                     * @member {number} end
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.end = 0;
    
                    /**
                     * Annotation semantic.
                     * @member {google.protobuf.GeneratedCodeInfo.Annotation.Semantic} semantic
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.semantic = 0;
    
                    /**
                     * Creates a new Annotation instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation=} [properties] Properties to set
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation instance
                     */
                    Annotation.create = function create(properties) {
                        return new Annotation(properties);
                    };
    
                    /**
                     * Encodes the specified Annotation message. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.Annotation.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation} message Annotation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Annotation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.path != null && message.path.length) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork();
                            for (var i = 0; i < message.path.length; ++i)
                                writer.int32(message.path[i]);
                            writer.ldelim();
                        }
                        if (message.sourceFile != null && Object.hasOwnProperty.call(message, "sourceFile"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.sourceFile);
                        if (message.begin != null && Object.hasOwnProperty.call(message, "begin"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.begin);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.end);
                        if (message.semantic != null && Object.hasOwnProperty.call(message, "semantic"))
                            writer.uint32(/* id 5, wireType 0 =*/40).int32(message.semantic);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Annotation message, length delimited. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.Annotation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation} message Annotation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Annotation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an Annotation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Annotation.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.GeneratedCodeInfo.Annotation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.path && message.path.length))
                                        message.path = [];
                                    if ((tag & 7) === 2) {
                                        var end2 = reader.uint32() + reader.pos;
                                        while (reader.pos < end2)
                                            message.path.push(reader.int32());
                                    } else
                                        message.path.push(reader.int32());
                                    break;
                                }
                            case 2: {
                                    message.sourceFile = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.begin = reader.int32();
                                    break;
                                }
                            case 4: {
                                    message.end = reader.int32();
                                    break;
                                }
                            case 5: {
                                    message.semantic = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an Annotation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Annotation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an Annotation message.
                     * @function verify
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Annotation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.path != null && message.hasOwnProperty("path")) {
                            if (!Array.isArray(message.path))
                                return "path: array expected";
                            for (var i = 0; i < message.path.length; ++i)
                                if (!$util.isInteger(message.path[i]))
                                    return "path: integer[] expected";
                        }
                        if (message.sourceFile != null && message.hasOwnProperty("sourceFile"))
                            if (!$util.isString(message.sourceFile))
                                return "sourceFile: string expected";
                        if (message.begin != null && message.hasOwnProperty("begin"))
                            if (!$util.isInteger(message.begin))
                                return "begin: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        if (message.semantic != null && message.hasOwnProperty("semantic"))
                            switch (message.semantic) {
                            default:
                                return "semantic: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        return null;
                    };
    
                    /**
                     * Creates an Annotation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     */
                    Annotation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.GeneratedCodeInfo.Annotation)
                            return object;
                        var message = new $root.google.protobuf.GeneratedCodeInfo.Annotation();
                        if (object.path) {
                            if (!Array.isArray(object.path))
                                throw TypeError(".google.protobuf.GeneratedCodeInfo.Annotation.path: array expected");
                            message.path = [];
                            for (var i = 0; i < object.path.length; ++i)
                                message.path[i] = object.path[i] | 0;
                        }
                        if (object.sourceFile != null)
                            message.sourceFile = String(object.sourceFile);
                        if (object.begin != null)
                            message.begin = object.begin | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        switch (object.semantic) {
                        default:
                            if (typeof object.semantic === "number") {
                                message.semantic = object.semantic;
                                break;
                            }
                            break;
                        case "NONE":
                        case 0:
                            message.semantic = 0;
                            break;
                        case "SET":
                        case 1:
                            message.semantic = 1;
                            break;
                        case "ALIAS":
                        case 2:
                            message.semantic = 2;
                            break;
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an Annotation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.Annotation} message Annotation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Annotation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.path = [];
                        if (options.defaults) {
                            object.sourceFile = "";
                            object.begin = 0;
                            object.end = 0;
                            object.semantic = options.enums === String ? "NONE" : 0;
                        }
                        if (message.path && message.path.length) {
                            object.path = [];
                            for (var j = 0; j < message.path.length; ++j)
                                object.path[j] = message.path[j];
                        }
                        if (message.sourceFile != null && message.hasOwnProperty("sourceFile"))
                            object.sourceFile = message.sourceFile;
                        if (message.begin != null && message.hasOwnProperty("begin"))
                            object.begin = message.begin;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        if (message.semantic != null && message.hasOwnProperty("semantic"))
                            object.semantic = options.enums === String ? $root.google.protobuf.GeneratedCodeInfo.Annotation.Semantic[message.semantic] === undefined ? message.semantic : $root.google.protobuf.GeneratedCodeInfo.Annotation.Semantic[message.semantic] : message.semantic;
                        return object;
                    };
    
                    /**
                     * Converts this Annotation to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Annotation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Annotation
                     * @function getTypeUrl
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Annotation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.protobuf.GeneratedCodeInfo.Annotation";
                    };
    
                    /**
                     * Semantic enum.
                     * @name google.protobuf.GeneratedCodeInfo.Annotation.Semantic
                     * @enum {number}
                     * @property {number} NONE=0 NONE value
                     * @property {number} SET=1 SET value
                     * @property {number} ALIAS=2 ALIAS value
                     */
                    Annotation.Semantic = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "NONE"] = 0;
                        values[valuesById[1] = "SET"] = 1;
                        values[valuesById[2] = "ALIAS"] = 2;
                        return values;
                    })();
    
                    return Annotation;
                })();
    
                return GeneratedCodeInfo;
            })();
    
            /**
             * SymbolVisibility enum.
             * @name google.protobuf.SymbolVisibility
             * @enum {number}
             * @property {number} VISIBILITY_UNSET=0 VISIBILITY_UNSET value
             * @property {number} VISIBILITY_LOCAL=1 VISIBILITY_LOCAL value
             * @property {number} VISIBILITY_EXPORT=2 VISIBILITY_EXPORT value
             */
            protobuf.SymbolVisibility = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "VISIBILITY_UNSET"] = 0;
                values[valuesById[1] = "VISIBILITY_LOCAL"] = 1;
                values[valuesById[2] = "VISIBILITY_EXPORT"] = 2;
                return values;
            })();
    
            protobuf.Any = (function() {
    
                /**
                 * Properties of an Any.
                 * @memberof google.protobuf
                 * @interface IAny
                 * @property {string|null} [type_url] Any type_url
                 * @property {Uint8Array|null} [value] Any value
                 */
    
                /**
                 * Constructs a new Any.
                 * @memberof google.protobuf
                 * @classdesc Represents an Any.
                 * @implements IAny
                 * @constructor
                 * @param {google.protobuf.IAny=} [properties] Properties to set
                 */
                function Any(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Any type_url.
                 * @member {string} type_url
                 * @memberof google.protobuf.Any
                 * @instance
                 */
                Any.prototype.type_url = "";
    
                /**
                 * Any value.
                 * @member {Uint8Array} value
                 * @memberof google.protobuf.Any
                 * @instance
                 */
                Any.prototype.value = $util.newBuffer([]);
    
                /**
                 * Creates a new Any instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny=} [properties] Properties to set
                 * @returns {google.protobuf.Any} Any instance
                 */
                Any.create = function create(properties) {
                    return new Any(properties);
                };
    
                /**
                 * Encodes the specified Any message. Does not implicitly {@link google.protobuf.Any.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny} message Any message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Any.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type_url != null && Object.hasOwnProperty.call(message, "type_url"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type_url);
                    if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                        writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value);
                    return writer;
                };
    
                /**
                 * Encodes the specified Any message, length delimited. Does not implicitly {@link google.protobuf.Any.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny} message Any message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Any.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Any message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Any} Any
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Any.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Any();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.type_url = reader.string();
                                break;
                            }
                        case 2: {
                                message.value = reader.bytes();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Any message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Any} Any
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Any.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Any message.
                 * @function verify
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Any.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type_url != null && message.hasOwnProperty("type_url"))
                        if (!$util.isString(message.type_url))
                            return "type_url: string expected";
                    if (message.value != null && message.hasOwnProperty("value"))
                        if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                            return "value: buffer expected";
                    return null;
                };
    
                /**
                 * Creates an Any message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Any} Any
                 */
                Any.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Any)
                        return object;
                    var message = new $root.google.protobuf.Any();
                    if (object.type_url != null)
                        message.type_url = String(object.type_url);
                    if (object.value != null)
                        if (typeof object.value === "string")
                            $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                        else if (object.value.length >= 0)
                            message.value = object.value;
                    return message;
                };
    
                /**
                 * Creates a plain object from an Any message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.Any} message Any
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Any.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.type_url = "";
                        if (options.bytes === String)
                            object.value = "";
                        else {
                            object.value = [];
                            if (options.bytes !== Array)
                                object.value = $util.newBuffer(object.value);
                        }
                    }
                    if (message.type_url != null && message.hasOwnProperty("type_url"))
                        object.type_url = message.type_url;
                    if (message.value != null && message.hasOwnProperty("value"))
                        object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
                    return object;
                };
    
                /**
                 * Converts this Any to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Any
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Any.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Any
                 * @function getTypeUrl
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Any.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Any";
                };
    
                return Any;
            })();
    
            protobuf.Empty = (function() {
    
                /**
                 * Properties of an Empty.
                 * @memberof google.protobuf
                 * @interface IEmpty
                 */
    
                /**
                 * Constructs a new Empty.
                 * @memberof google.protobuf
                 * @classdesc Represents an Empty.
                 * @implements IEmpty
                 * @constructor
                 * @param {google.protobuf.IEmpty=} [properties] Properties to set
                 */
                function Empty(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Creates a new Empty instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty=} [properties] Properties to set
                 * @returns {google.protobuf.Empty} Empty instance
                 */
                Empty.create = function create(properties) {
                    return new Empty(properties);
                };
    
                /**
                 * Encodes the specified Empty message. Does not implicitly {@link google.protobuf.Empty.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty} message Empty message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Empty.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    return writer;
                };
    
                /**
                 * Encodes the specified Empty message, length delimited. Does not implicitly {@link google.protobuf.Empty.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty} message Empty message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Empty.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Empty message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Empty} Empty
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Empty.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Empty();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Empty message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Empty} Empty
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Empty.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Empty message.
                 * @function verify
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Empty.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    return null;
                };
    
                /**
                 * Creates an Empty message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Empty} Empty
                 */
                Empty.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Empty)
                        return object;
                    return new $root.google.protobuf.Empty();
                };
    
                /**
                 * Creates a plain object from an Empty message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.Empty} message Empty
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Empty.toObject = function toObject() {
                    return {};
                };
    
                /**
                 * Converts this Empty to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Empty
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Empty.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Empty
                 * @function getTypeUrl
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Empty.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Empty";
                };
    
                return Empty;
            })();
    
            protobuf.FieldMask = (function() {
    
                /**
                 * Properties of a FieldMask.
                 * @memberof google.protobuf
                 * @interface IFieldMask
                 * @property {Array.<string>|null} [paths] FieldMask paths
                 */
    
                /**
                 * Constructs a new FieldMask.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldMask.
                 * @implements IFieldMask
                 * @constructor
                 * @param {google.protobuf.IFieldMask=} [properties] Properties to set
                 */
                function FieldMask(properties) {
                    this.paths = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldMask paths.
                 * @member {Array.<string>} paths
                 * @memberof google.protobuf.FieldMask
                 * @instance
                 */
                FieldMask.prototype.paths = $util.emptyArray;
    
                /**
                 * Creates a new FieldMask instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask=} [properties] Properties to set
                 * @returns {google.protobuf.FieldMask} FieldMask instance
                 */
                FieldMask.create = function create(properties) {
                    return new FieldMask(properties);
                };
    
                /**
                 * Encodes the specified FieldMask message. Does not implicitly {@link google.protobuf.FieldMask.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask} message FieldMask message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldMask.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.paths != null && message.paths.length)
                        for (var i = 0; i < message.paths.length; ++i)
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.paths[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldMask message, length delimited. Does not implicitly {@link google.protobuf.FieldMask.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask} message FieldMask message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldMask.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldMask message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldMask} FieldMask
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldMask.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldMask();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.paths && message.paths.length))
                                    message.paths = [];
                                message.paths.push(reader.string());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldMask message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldMask} FieldMask
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldMask.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldMask message.
                 * @function verify
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldMask.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.paths != null && message.hasOwnProperty("paths")) {
                        if (!Array.isArray(message.paths))
                            return "paths: array expected";
                        for (var i = 0; i < message.paths.length; ++i)
                            if (!$util.isString(message.paths[i]))
                                return "paths: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a FieldMask message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldMask} FieldMask
                 */
                FieldMask.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldMask)
                        return object;
                    var message = new $root.google.protobuf.FieldMask();
                    if (object.paths) {
                        if (!Array.isArray(object.paths))
                            throw TypeError(".google.protobuf.FieldMask.paths: array expected");
                        message.paths = [];
                        for (var i = 0; i < object.paths.length; ++i)
                            message.paths[i] = String(object.paths[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldMask message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.FieldMask} message FieldMask
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldMask.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.paths = [];
                    if (message.paths && message.paths.length) {
                        object.paths = [];
                        for (var j = 0; j < message.paths.length; ++j)
                            object.paths[j] = message.paths[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this FieldMask to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldMask
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldMask.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for FieldMask
                 * @function getTypeUrl
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                FieldMask.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.FieldMask";
                };
    
                return FieldMask;
            })();
    
            protobuf.Timestamp = (function() {
    
                /**
                 * Properties of a Timestamp.
                 * @memberof google.protobuf
                 * @interface ITimestamp
                 * @property {number|Long|null} [seconds] Timestamp seconds
                 * @property {number|null} [nanos] Timestamp nanos
                 */
    
                /**
                 * Constructs a new Timestamp.
                 * @memberof google.protobuf
                 * @classdesc Represents a Timestamp.
                 * @implements ITimestamp
                 * @constructor
                 * @param {google.protobuf.ITimestamp=} [properties] Properties to set
                 */
                function Timestamp(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Timestamp seconds.
                 * @member {number|Long} seconds
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 */
                Timestamp.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * Timestamp nanos.
                 * @member {number} nanos
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 */
                Timestamp.prototype.nanos = 0;
    
                /**
                 * Creates a new Timestamp instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp=} [properties] Properties to set
                 * @returns {google.protobuf.Timestamp} Timestamp instance
                 */
                Timestamp.create = function create(properties) {
                    return new Timestamp(properties);
                };
    
                /**
                 * Encodes the specified Timestamp message. Does not implicitly {@link google.protobuf.Timestamp.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp} message Timestamp message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Timestamp.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds);
                    if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos);
                    return writer;
                };
    
                /**
                 * Encodes the specified Timestamp message, length delimited. Does not implicitly {@link google.protobuf.Timestamp.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp} message Timestamp message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Timestamp.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Timestamp message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Timestamp} Timestamp
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Timestamp.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Timestamp();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.seconds = reader.int64();
                                break;
                            }
                        case 2: {
                                message.nanos = reader.int32();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Timestamp message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Timestamp} Timestamp
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Timestamp.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Timestamp message.
                 * @function verify
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Timestamp.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high)))
                            return "seconds: integer|Long expected";
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        if (!$util.isInteger(message.nanos))
                            return "nanos: integer expected";
                    return null;
                };
    
                /**
                 * Creates a Timestamp message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Timestamp} Timestamp
                 */
                Timestamp.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Timestamp)
                        return object;
                    var message = new $root.google.protobuf.Timestamp();
                    if (object.seconds != null)
                        if ($util.Long)
                            (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false;
                        else if (typeof object.seconds === "string")
                            message.seconds = parseInt(object.seconds, 10);
                        else if (typeof object.seconds === "number")
                            message.seconds = object.seconds;
                        else if (typeof object.seconds === "object")
                            message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber();
                    if (object.nanos != null)
                        message.nanos = object.nanos | 0;
                    return message;
                };
    
                /**
                 * Creates a plain object from a Timestamp message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.Timestamp} message Timestamp
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Timestamp.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.seconds = options.longs === String ? "0" : 0;
                        object.nanos = 0;
                    }
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (typeof message.seconds === "number")
                            object.seconds = options.longs === String ? String(message.seconds) : message.seconds;
                        else
                            object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds;
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        object.nanos = message.nanos;
                    return object;
                };
    
                /**
                 * Converts this Timestamp to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Timestamp.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Timestamp
                 * @function getTypeUrl
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Timestamp.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Timestamp";
                };
    
                return Timestamp;
            })();
    
            protobuf.Struct = (function() {
    
                /**
                 * Properties of a Struct.
                 * @memberof google.protobuf
                 * @interface IStruct
                 * @property {Object.<string,google.protobuf.IValue>|null} [fields] Struct fields
                 */
    
                /**
                 * Constructs a new Struct.
                 * @memberof google.protobuf
                 * @classdesc Represents a Struct.
                 * @implements IStruct
                 * @constructor
                 * @param {google.protobuf.IStruct=} [properties] Properties to set
                 */
                function Struct(properties) {
                    this.fields = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Struct fields.
                 * @member {Object.<string,google.protobuf.IValue>} fields
                 * @memberof google.protobuf.Struct
                 * @instance
                 */
                Struct.prototype.fields = $util.emptyObject;
    
                /**
                 * Creates a new Struct instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct=} [properties] Properties to set
                 * @returns {google.protobuf.Struct} Struct instance
                 */
                Struct.create = function create(properties) {
                    return new Struct(properties);
                };
    
                /**
                 * Encodes the specified Struct message. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct} message Struct message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Struct.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.fields != null && Object.hasOwnProperty.call(message, "fields"))
                        for (var keys = Object.keys(message.fields), i = 0; i < keys.length; ++i) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);
                            $root.google.protobuf.Value.encode(message.fields[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                        }
                    return writer;
                };
    
                /**
                 * Encodes the specified Struct message, length delimited. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct} message Struct message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Struct.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Struct message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Struct} Struct
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Struct.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Struct(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (message.fields === $util.emptyObject)
                                    message.fields = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = null;
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = $root.google.protobuf.Value.decode(reader, reader.uint32());
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.fields[key] = value;
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Struct message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Struct} Struct
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Struct.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Struct message.
                 * @function verify
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Struct.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.fields != null && message.hasOwnProperty("fields")) {
                        if (!$util.isObject(message.fields))
                            return "fields: object expected";
                        var key = Object.keys(message.fields);
                        for (var i = 0; i < key.length; ++i) {
                            var error = $root.google.protobuf.Value.verify(message.fields[key[i]]);
                            if (error)
                                return "fields." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Struct message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Struct} Struct
                 */
                Struct.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Struct)
                        return object;
                    var message = new $root.google.protobuf.Struct();
                    if (object.fields) {
                        if (typeof object.fields !== "object")
                            throw TypeError(".google.protobuf.Struct.fields: object expected");
                        message.fields = {};
                        for (var keys = Object.keys(object.fields), i = 0; i < keys.length; ++i) {
                            if (typeof object.fields[keys[i]] !== "object")
                                throw TypeError(".google.protobuf.Struct.fields: object expected");
                            message.fields[keys[i]] = $root.google.protobuf.Value.fromObject(object.fields[keys[i]]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Struct message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.Struct} message Struct
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Struct.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.fields = {};
                    var keys2;
                    if (message.fields && (keys2 = Object.keys(message.fields)).length) {
                        object.fields = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.fields[keys2[j]] = $root.google.protobuf.Value.toObject(message.fields[keys2[j]], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Struct to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Struct
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Struct.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Struct
                 * @function getTypeUrl
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Struct.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Struct";
                };
    
                return Struct;
            })();
    
            protobuf.Value = (function() {
    
                /**
                 * Properties of a Value.
                 * @memberof google.protobuf
                 * @interface IValue
                 * @property {google.protobuf.NullValue|null} [nullValue] Value nullValue
                 * @property {number|null} [numberValue] Value numberValue
                 * @property {string|null} [stringValue] Value stringValue
                 * @property {boolean|null} [boolValue] Value boolValue
                 * @property {google.protobuf.IStruct|null} [structValue] Value structValue
                 * @property {google.protobuf.IListValue|null} [listValue] Value listValue
                 */
    
                /**
                 * Constructs a new Value.
                 * @memberof google.protobuf
                 * @classdesc Represents a Value.
                 * @implements IValue
                 * @constructor
                 * @param {google.protobuf.IValue=} [properties] Properties to set
                 */
                function Value(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Value nullValue.
                 * @member {google.protobuf.NullValue|null|undefined} nullValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.nullValue = null;
    
                /**
                 * Value numberValue.
                 * @member {number|null|undefined} numberValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.numberValue = null;
    
                /**
                 * Value stringValue.
                 * @member {string|null|undefined} stringValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.stringValue = null;
    
                /**
                 * Value boolValue.
                 * @member {boolean|null|undefined} boolValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.boolValue = null;
    
                /**
                 * Value structValue.
                 * @member {google.protobuf.IStruct|null|undefined} structValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.structValue = null;
    
                /**
                 * Value listValue.
                 * @member {google.protobuf.IListValue|null|undefined} listValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.listValue = null;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * Value kind.
                 * @member {"nullValue"|"numberValue"|"stringValue"|"boolValue"|"structValue"|"listValue"|undefined} kind
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Object.defineProperty(Value.prototype, "kind", {
                    get: $util.oneOfGetter($oneOfFields = ["nullValue", "numberValue", "stringValue", "boolValue", "structValue", "listValue"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new Value instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue=} [properties] Properties to set
                 * @returns {google.protobuf.Value} Value instance
                 */
                Value.create = function create(properties) {
                    return new Value(properties);
                };
    
                /**
                 * Encodes the specified Value message. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue} message Value message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Value.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.nullValue != null && Object.hasOwnProperty.call(message, "nullValue"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.nullValue);
                    if (message.numberValue != null && Object.hasOwnProperty.call(message, "numberValue"))
                        writer.uint32(/* id 2, wireType 1 =*/17).double(message.numberValue);
                    if (message.stringValue != null && Object.hasOwnProperty.call(message, "stringValue"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.stringValue);
                    if (message.boolValue != null && Object.hasOwnProperty.call(message, "boolValue"))
                        writer.uint32(/* id 4, wireType 0 =*/32).bool(message.boolValue);
                    if (message.structValue != null && Object.hasOwnProperty.call(message, "structValue"))
                        $root.google.protobuf.Struct.encode(message.structValue, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.listValue != null && Object.hasOwnProperty.call(message, "listValue"))
                        $root.google.protobuf.ListValue.encode(message.listValue, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Value message, length delimited. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue} message Value message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Value.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Value message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Value} Value
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Value.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Value();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.nullValue = reader.int32();
                                break;
                            }
                        case 2: {
                                message.numberValue = reader.double();
                                break;
                            }
                        case 3: {
                                message.stringValue = reader.string();
                                break;
                            }
                        case 4: {
                                message.boolValue = reader.bool();
                                break;
                            }
                        case 5: {
                                message.structValue = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                break;
                            }
                        case 6: {
                                message.listValue = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Value message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Value} Value
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Value.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Value message.
                 * @function verify
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Value.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.nullValue != null && message.hasOwnProperty("nullValue")) {
                        properties.kind = 1;
                        switch (message.nullValue) {
                        default:
                            return "nullValue: enum value expected";
                        case 0:
                            break;
                        }
                    }
                    if (message.numberValue != null && message.hasOwnProperty("numberValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (typeof message.numberValue !== "number")
                            return "numberValue: number expected";
                    }
                    if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (!$util.isString(message.stringValue))
                            return "stringValue: string expected";
                    }
                    if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (typeof message.boolValue !== "boolean")
                            return "boolValue: boolean expected";
                    }
                    if (message.structValue != null && message.hasOwnProperty("structValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        {
                            var error = $root.google.protobuf.Struct.verify(message.structValue);
                            if (error)
                                return "structValue." + error;
                        }
                    }
                    if (message.listValue != null && message.hasOwnProperty("listValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        {
                            var error = $root.google.protobuf.ListValue.verify(message.listValue);
                            if (error)
                                return "listValue." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Value message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Value} Value
                 */
                Value.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Value)
                        return object;
                    var message = new $root.google.protobuf.Value();
                    switch (object.nullValue) {
                    default:
                        if (typeof object.nullValue === "number") {
                            message.nullValue = object.nullValue;
                            break;
                        }
                        break;
                    case "NULL_VALUE":
                    case 0:
                        message.nullValue = 0;
                        break;
                    }
                    if (object.numberValue != null)
                        message.numberValue = Number(object.numberValue);
                    if (object.stringValue != null)
                        message.stringValue = String(object.stringValue);
                    if (object.boolValue != null)
                        message.boolValue = Boolean(object.boolValue);
                    if (object.structValue != null) {
                        if (typeof object.structValue !== "object")
                            throw TypeError(".google.protobuf.Value.structValue: object expected");
                        message.structValue = $root.google.protobuf.Struct.fromObject(object.structValue);
                    }
                    if (object.listValue != null) {
                        if (typeof object.listValue !== "object")
                            throw TypeError(".google.protobuf.Value.listValue: object expected");
                        message.listValue = $root.google.protobuf.ListValue.fromObject(object.listValue);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Value message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.Value} message Value
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Value.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (message.nullValue != null && message.hasOwnProperty("nullValue")) {
                        object.nullValue = options.enums === String ? $root.google.protobuf.NullValue[message.nullValue] === undefined ? message.nullValue : $root.google.protobuf.NullValue[message.nullValue] : message.nullValue;
                        if (options.oneofs)
                            object.kind = "nullValue";
                    }
                    if (message.numberValue != null && message.hasOwnProperty("numberValue")) {
                        object.numberValue = options.json && !isFinite(message.numberValue) ? String(message.numberValue) : message.numberValue;
                        if (options.oneofs)
                            object.kind = "numberValue";
                    }
                    if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                        object.stringValue = message.stringValue;
                        if (options.oneofs)
                            object.kind = "stringValue";
                    }
                    if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                        object.boolValue = message.boolValue;
                        if (options.oneofs)
                            object.kind = "boolValue";
                    }
                    if (message.structValue != null && message.hasOwnProperty("structValue")) {
                        object.structValue = $root.google.protobuf.Struct.toObject(message.structValue, options);
                        if (options.oneofs)
                            object.kind = "structValue";
                    }
                    if (message.listValue != null && message.hasOwnProperty("listValue")) {
                        object.listValue = $root.google.protobuf.ListValue.toObject(message.listValue, options);
                        if (options.oneofs)
                            object.kind = "listValue";
                    }
                    return object;
                };
    
                /**
                 * Converts this Value to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Value
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Value.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Value
                 * @function getTypeUrl
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.Value";
                };
    
                return Value;
            })();
    
            /**
             * NullValue enum.
             * @name google.protobuf.NullValue
             * @enum {number}
             * @property {number} NULL_VALUE=0 NULL_VALUE value
             */
            protobuf.NullValue = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "NULL_VALUE"] = 0;
                return values;
            })();
    
            protobuf.ListValue = (function() {
    
                /**
                 * Properties of a ListValue.
                 * @memberof google.protobuf
                 * @interface IListValue
                 * @property {Array.<google.protobuf.IValue>|null} [values] ListValue values
                 */
    
                /**
                 * Constructs a new ListValue.
                 * @memberof google.protobuf
                 * @classdesc Represents a ListValue.
                 * @implements IListValue
                 * @constructor
                 * @param {google.protobuf.IListValue=} [properties] Properties to set
                 */
                function ListValue(properties) {
                    this.values = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListValue values.
                 * @member {Array.<google.protobuf.IValue>} values
                 * @memberof google.protobuf.ListValue
                 * @instance
                 */
                ListValue.prototype.values = $util.emptyArray;
    
                /**
                 * Creates a new ListValue instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue=} [properties] Properties to set
                 * @returns {google.protobuf.ListValue} ListValue instance
                 */
                ListValue.create = function create(properties) {
                    return new ListValue(properties);
                };
    
                /**
                 * Encodes the specified ListValue message. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue} message ListValue message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListValue.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.values != null && message.values.length)
                        for (var i = 0; i < message.values.length; ++i)
                            $root.google.protobuf.Value.encode(message.values[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ListValue message, length delimited. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue} message ListValue message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListValue.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListValue message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ListValue} ListValue
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListValue.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ListValue();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.values && message.values.length))
                                    message.values = [];
                                message.values.push($root.google.protobuf.Value.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListValue message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ListValue} ListValue
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListValue.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListValue message.
                 * @function verify
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListValue.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.values != null && message.hasOwnProperty("values")) {
                        if (!Array.isArray(message.values))
                            return "values: array expected";
                        for (var i = 0; i < message.values.length; ++i) {
                            var error = $root.google.protobuf.Value.verify(message.values[i]);
                            if (error)
                                return "values." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a ListValue message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ListValue} ListValue
                 */
                ListValue.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ListValue)
                        return object;
                    var message = new $root.google.protobuf.ListValue();
                    if (object.values) {
                        if (!Array.isArray(object.values))
                            throw TypeError(".google.protobuf.ListValue.values: array expected");
                        message.values = [];
                        for (var i = 0; i < object.values.length; ++i) {
                            if (typeof object.values[i] !== "object")
                                throw TypeError(".google.protobuf.ListValue.values: object expected");
                            message.values[i] = $root.google.protobuf.Value.fromObject(object.values[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListValue message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.ListValue} message ListValue
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListValue.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.values = [];
                    if (message.values && message.values.length) {
                        object.values = [];
                        for (var j = 0; j < message.values.length; ++j)
                            object.values[j] = $root.google.protobuf.Value.toObject(message.values[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this ListValue to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ListValue
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListValue.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ListValue
                 * @function getTypeUrl
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ListValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.protobuf.ListValue";
                };
    
                return ListValue;
            })();
    
            return protobuf;
        })();
    
        google.rpc = (function() {
    
            /**
             * Namespace rpc.
             * @memberof google
             * @namespace
             */
            var rpc = {};
    
            rpc.ErrorInfo = (function() {
    
                /**
                 * Properties of an ErrorInfo.
                 * @memberof google.rpc
                 * @interface IErrorInfo
                 * @property {string|null} [reason] ErrorInfo reason
                 * @property {string|null} [domain] ErrorInfo domain
                 * @property {Object.<string,string>|null} [metadata] ErrorInfo metadata
                 */
    
                /**
                 * Constructs a new ErrorInfo.
                 * @memberof google.rpc
                 * @classdesc Represents an ErrorInfo.
                 * @implements IErrorInfo
                 * @constructor
                 * @param {google.rpc.IErrorInfo=} [properties] Properties to set
                 */
                function ErrorInfo(properties) {
                    this.metadata = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ErrorInfo reason.
                 * @member {string} reason
                 * @memberof google.rpc.ErrorInfo
                 * @instance
                 */
                ErrorInfo.prototype.reason = "";
    
                /**
                 * ErrorInfo domain.
                 * @member {string} domain
                 * @memberof google.rpc.ErrorInfo
                 * @instance
                 */
                ErrorInfo.prototype.domain = "";
    
                /**
                 * ErrorInfo metadata.
                 * @member {Object.<string,string>} metadata
                 * @memberof google.rpc.ErrorInfo
                 * @instance
                 */
                ErrorInfo.prototype.metadata = $util.emptyObject;
    
                /**
                 * Creates a new ErrorInfo instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {google.rpc.IErrorInfo=} [properties] Properties to set
                 * @returns {google.rpc.ErrorInfo} ErrorInfo instance
                 */
                ErrorInfo.create = function create(properties) {
                    return new ErrorInfo(properties);
                };
    
                /**
                 * Encodes the specified ErrorInfo message. Does not implicitly {@link google.rpc.ErrorInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {google.rpc.IErrorInfo} message ErrorInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ErrorInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.reason != null && Object.hasOwnProperty.call(message, "reason"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.reason);
                    if (message.domain != null && Object.hasOwnProperty.call(message, "domain"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.domain);
                    if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                        for (var keys = Object.keys(message.metadata), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.metadata[keys[i]]).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ErrorInfo message, length delimited. Does not implicitly {@link google.rpc.ErrorInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {google.rpc.IErrorInfo} message ErrorInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ErrorInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an ErrorInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.ErrorInfo} ErrorInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ErrorInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.ErrorInfo(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.reason = reader.string();
                                break;
                            }
                        case 2: {
                                message.domain = reader.string();
                                break;
                            }
                        case 3: {
                                if (message.metadata === $util.emptyObject)
                                    message.metadata = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.metadata[key] = value;
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an ErrorInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.ErrorInfo} ErrorInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ErrorInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an ErrorInfo message.
                 * @function verify
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ErrorInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.reason != null && message.hasOwnProperty("reason"))
                        if (!$util.isString(message.reason))
                            return "reason: string expected";
                    if (message.domain != null && message.hasOwnProperty("domain"))
                        if (!$util.isString(message.domain))
                            return "domain: string expected";
                    if (message.metadata != null && message.hasOwnProperty("metadata")) {
                        if (!$util.isObject(message.metadata))
                            return "metadata: object expected";
                        var key = Object.keys(message.metadata);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.metadata[key[i]]))
                                return "metadata: string{k:string} expected";
                    }
                    return null;
                };
    
                /**
                 * Creates an ErrorInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.ErrorInfo} ErrorInfo
                 */
                ErrorInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.ErrorInfo)
                        return object;
                    var message = new $root.google.rpc.ErrorInfo();
                    if (object.reason != null)
                        message.reason = String(object.reason);
                    if (object.domain != null)
                        message.domain = String(object.domain);
                    if (object.metadata) {
                        if (typeof object.metadata !== "object")
                            throw TypeError(".google.rpc.ErrorInfo.metadata: object expected");
                        message.metadata = {};
                        for (var keys = Object.keys(object.metadata), i = 0; i < keys.length; ++i)
                            message.metadata[keys[i]] = String(object.metadata[keys[i]]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an ErrorInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {google.rpc.ErrorInfo} message ErrorInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ErrorInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.metadata = {};
                    if (options.defaults) {
                        object.reason = "";
                        object.domain = "";
                    }
                    if (message.reason != null && message.hasOwnProperty("reason"))
                        object.reason = message.reason;
                    if (message.domain != null && message.hasOwnProperty("domain"))
                        object.domain = message.domain;
                    var keys2;
                    if (message.metadata && (keys2 = Object.keys(message.metadata)).length) {
                        object.metadata = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.metadata[keys2[j]] = message.metadata[keys2[j]];
                    }
                    return object;
                };
    
                /**
                 * Converts this ErrorInfo to JSON.
                 * @function toJSON
                 * @memberof google.rpc.ErrorInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ErrorInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ErrorInfo
                 * @function getTypeUrl
                 * @memberof google.rpc.ErrorInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ErrorInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.ErrorInfo";
                };
    
                return ErrorInfo;
            })();
    
            rpc.RetryInfo = (function() {
    
                /**
                 * Properties of a RetryInfo.
                 * @memberof google.rpc
                 * @interface IRetryInfo
                 * @property {google.protobuf.IDuration|null} [retryDelay] RetryInfo retryDelay
                 */
    
                /**
                 * Constructs a new RetryInfo.
                 * @memberof google.rpc
                 * @classdesc Represents a RetryInfo.
                 * @implements IRetryInfo
                 * @constructor
                 * @param {google.rpc.IRetryInfo=} [properties] Properties to set
                 */
                function RetryInfo(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * RetryInfo retryDelay.
                 * @member {google.protobuf.IDuration|null|undefined} retryDelay
                 * @memberof google.rpc.RetryInfo
                 * @instance
                 */
                RetryInfo.prototype.retryDelay = null;
    
                /**
                 * Creates a new RetryInfo instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {google.rpc.IRetryInfo=} [properties] Properties to set
                 * @returns {google.rpc.RetryInfo} RetryInfo instance
                 */
                RetryInfo.create = function create(properties) {
                    return new RetryInfo(properties);
                };
    
                /**
                 * Encodes the specified RetryInfo message. Does not implicitly {@link google.rpc.RetryInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {google.rpc.IRetryInfo} message RetryInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RetryInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.retryDelay != null && Object.hasOwnProperty.call(message, "retryDelay"))
                        $root.google.protobuf.Duration.encode(message.retryDelay, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified RetryInfo message, length delimited. Does not implicitly {@link google.rpc.RetryInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {google.rpc.IRetryInfo} message RetryInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RetryInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a RetryInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.RetryInfo} RetryInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RetryInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.RetryInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.retryDelay = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a RetryInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.RetryInfo} RetryInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RetryInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a RetryInfo message.
                 * @function verify
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                RetryInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.retryDelay != null && message.hasOwnProperty("retryDelay")) {
                        var error = $root.google.protobuf.Duration.verify(message.retryDelay);
                        if (error)
                            return "retryDelay." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a RetryInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.RetryInfo} RetryInfo
                 */
                RetryInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.RetryInfo)
                        return object;
                    var message = new $root.google.rpc.RetryInfo();
                    if (object.retryDelay != null) {
                        if (typeof object.retryDelay !== "object")
                            throw TypeError(".google.rpc.RetryInfo.retryDelay: object expected");
                        message.retryDelay = $root.google.protobuf.Duration.fromObject(object.retryDelay);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a RetryInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {google.rpc.RetryInfo} message RetryInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                RetryInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.retryDelay = null;
                    if (message.retryDelay != null && message.hasOwnProperty("retryDelay"))
                        object.retryDelay = $root.google.protobuf.Duration.toObject(message.retryDelay, options);
                    return object;
                };
    
                /**
                 * Converts this RetryInfo to JSON.
                 * @function toJSON
                 * @memberof google.rpc.RetryInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                RetryInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for RetryInfo
                 * @function getTypeUrl
                 * @memberof google.rpc.RetryInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                RetryInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.RetryInfo";
                };
    
                return RetryInfo;
            })();
    
            rpc.DebugInfo = (function() {
    
                /**
                 * Properties of a DebugInfo.
                 * @memberof google.rpc
                 * @interface IDebugInfo
                 * @property {Array.<string>|null} [stackEntries] DebugInfo stackEntries
                 * @property {string|null} [detail] DebugInfo detail
                 */
    
                /**
                 * Constructs a new DebugInfo.
                 * @memberof google.rpc
                 * @classdesc Represents a DebugInfo.
                 * @implements IDebugInfo
                 * @constructor
                 * @param {google.rpc.IDebugInfo=} [properties] Properties to set
                 */
                function DebugInfo(properties) {
                    this.stackEntries = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DebugInfo stackEntries.
                 * @member {Array.<string>} stackEntries
                 * @memberof google.rpc.DebugInfo
                 * @instance
                 */
                DebugInfo.prototype.stackEntries = $util.emptyArray;
    
                /**
                 * DebugInfo detail.
                 * @member {string} detail
                 * @memberof google.rpc.DebugInfo
                 * @instance
                 */
                DebugInfo.prototype.detail = "";
    
                /**
                 * Creates a new DebugInfo instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {google.rpc.IDebugInfo=} [properties] Properties to set
                 * @returns {google.rpc.DebugInfo} DebugInfo instance
                 */
                DebugInfo.create = function create(properties) {
                    return new DebugInfo(properties);
                };
    
                /**
                 * Encodes the specified DebugInfo message. Does not implicitly {@link google.rpc.DebugInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {google.rpc.IDebugInfo} message DebugInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DebugInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.stackEntries != null && message.stackEntries.length)
                        for (var i = 0; i < message.stackEntries.length; ++i)
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.stackEntries[i]);
                    if (message.detail != null && Object.hasOwnProperty.call(message, "detail"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.detail);
                    return writer;
                };
    
                /**
                 * Encodes the specified DebugInfo message, length delimited. Does not implicitly {@link google.rpc.DebugInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {google.rpc.IDebugInfo} message DebugInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DebugInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DebugInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.DebugInfo} DebugInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DebugInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.DebugInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.stackEntries && message.stackEntries.length))
                                    message.stackEntries = [];
                                message.stackEntries.push(reader.string());
                                break;
                            }
                        case 2: {
                                message.detail = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DebugInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.DebugInfo} DebugInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DebugInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DebugInfo message.
                 * @function verify
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DebugInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.stackEntries != null && message.hasOwnProperty("stackEntries")) {
                        if (!Array.isArray(message.stackEntries))
                            return "stackEntries: array expected";
                        for (var i = 0; i < message.stackEntries.length; ++i)
                            if (!$util.isString(message.stackEntries[i]))
                                return "stackEntries: string[] expected";
                    }
                    if (message.detail != null && message.hasOwnProperty("detail"))
                        if (!$util.isString(message.detail))
                            return "detail: string expected";
                    return null;
                };
    
                /**
                 * Creates a DebugInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.DebugInfo} DebugInfo
                 */
                DebugInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.DebugInfo)
                        return object;
                    var message = new $root.google.rpc.DebugInfo();
                    if (object.stackEntries) {
                        if (!Array.isArray(object.stackEntries))
                            throw TypeError(".google.rpc.DebugInfo.stackEntries: array expected");
                        message.stackEntries = [];
                        for (var i = 0; i < object.stackEntries.length; ++i)
                            message.stackEntries[i] = String(object.stackEntries[i]);
                    }
                    if (object.detail != null)
                        message.detail = String(object.detail);
                    return message;
                };
    
                /**
                 * Creates a plain object from a DebugInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {google.rpc.DebugInfo} message DebugInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DebugInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.stackEntries = [];
                    if (options.defaults)
                        object.detail = "";
                    if (message.stackEntries && message.stackEntries.length) {
                        object.stackEntries = [];
                        for (var j = 0; j < message.stackEntries.length; ++j)
                            object.stackEntries[j] = message.stackEntries[j];
                    }
                    if (message.detail != null && message.hasOwnProperty("detail"))
                        object.detail = message.detail;
                    return object;
                };
    
                /**
                 * Converts this DebugInfo to JSON.
                 * @function toJSON
                 * @memberof google.rpc.DebugInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DebugInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for DebugInfo
                 * @function getTypeUrl
                 * @memberof google.rpc.DebugInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                DebugInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.DebugInfo";
                };
    
                return DebugInfo;
            })();
    
            rpc.QuotaFailure = (function() {
    
                /**
                 * Properties of a QuotaFailure.
                 * @memberof google.rpc
                 * @interface IQuotaFailure
                 * @property {Array.<google.rpc.QuotaFailure.IViolation>|null} [violations] QuotaFailure violations
                 */
    
                /**
                 * Constructs a new QuotaFailure.
                 * @memberof google.rpc
                 * @classdesc Represents a QuotaFailure.
                 * @implements IQuotaFailure
                 * @constructor
                 * @param {google.rpc.IQuotaFailure=} [properties] Properties to set
                 */
                function QuotaFailure(properties) {
                    this.violations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * QuotaFailure violations.
                 * @member {Array.<google.rpc.QuotaFailure.IViolation>} violations
                 * @memberof google.rpc.QuotaFailure
                 * @instance
                 */
                QuotaFailure.prototype.violations = $util.emptyArray;
    
                /**
                 * Creates a new QuotaFailure instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {google.rpc.IQuotaFailure=} [properties] Properties to set
                 * @returns {google.rpc.QuotaFailure} QuotaFailure instance
                 */
                QuotaFailure.create = function create(properties) {
                    return new QuotaFailure(properties);
                };
    
                /**
                 * Encodes the specified QuotaFailure message. Does not implicitly {@link google.rpc.QuotaFailure.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {google.rpc.IQuotaFailure} message QuotaFailure message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                QuotaFailure.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.violations != null && message.violations.length)
                        for (var i = 0; i < message.violations.length; ++i)
                            $root.google.rpc.QuotaFailure.Violation.encode(message.violations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified QuotaFailure message, length delimited. Does not implicitly {@link google.rpc.QuotaFailure.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {google.rpc.IQuotaFailure} message QuotaFailure message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                QuotaFailure.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a QuotaFailure message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.QuotaFailure} QuotaFailure
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                QuotaFailure.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.QuotaFailure();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.violations && message.violations.length))
                                    message.violations = [];
                                message.violations.push($root.google.rpc.QuotaFailure.Violation.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a QuotaFailure message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.QuotaFailure} QuotaFailure
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                QuotaFailure.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a QuotaFailure message.
                 * @function verify
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                QuotaFailure.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.violations != null && message.hasOwnProperty("violations")) {
                        if (!Array.isArray(message.violations))
                            return "violations: array expected";
                        for (var i = 0; i < message.violations.length; ++i) {
                            var error = $root.google.rpc.QuotaFailure.Violation.verify(message.violations[i]);
                            if (error)
                                return "violations." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a QuotaFailure message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.QuotaFailure} QuotaFailure
                 */
                QuotaFailure.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.QuotaFailure)
                        return object;
                    var message = new $root.google.rpc.QuotaFailure();
                    if (object.violations) {
                        if (!Array.isArray(object.violations))
                            throw TypeError(".google.rpc.QuotaFailure.violations: array expected");
                        message.violations = [];
                        for (var i = 0; i < object.violations.length; ++i) {
                            if (typeof object.violations[i] !== "object")
                                throw TypeError(".google.rpc.QuotaFailure.violations: object expected");
                            message.violations[i] = $root.google.rpc.QuotaFailure.Violation.fromObject(object.violations[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a QuotaFailure message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {google.rpc.QuotaFailure} message QuotaFailure
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                QuotaFailure.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.violations = [];
                    if (message.violations && message.violations.length) {
                        object.violations = [];
                        for (var j = 0; j < message.violations.length; ++j)
                            object.violations[j] = $root.google.rpc.QuotaFailure.Violation.toObject(message.violations[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this QuotaFailure to JSON.
                 * @function toJSON
                 * @memberof google.rpc.QuotaFailure
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                QuotaFailure.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for QuotaFailure
                 * @function getTypeUrl
                 * @memberof google.rpc.QuotaFailure
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                QuotaFailure.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.QuotaFailure";
                };
    
                QuotaFailure.Violation = (function() {
    
                    /**
                     * Properties of a Violation.
                     * @memberof google.rpc.QuotaFailure
                     * @interface IViolation
                     * @property {string|null} [subject] Violation subject
                     * @property {string|null} [description] Violation description
                     * @property {string|null} [apiService] Violation apiService
                     * @property {string|null} [quotaMetric] Violation quotaMetric
                     * @property {string|null} [quotaId] Violation quotaId
                     * @property {Object.<string,string>|null} [quotaDimensions] Violation quotaDimensions
                     * @property {number|Long|null} [quotaValue] Violation quotaValue
                     * @property {number|Long|null} [futureQuotaValue] Violation futureQuotaValue
                     */
    
                    /**
                     * Constructs a new Violation.
                     * @memberof google.rpc.QuotaFailure
                     * @classdesc Represents a Violation.
                     * @implements IViolation
                     * @constructor
                     * @param {google.rpc.QuotaFailure.IViolation=} [properties] Properties to set
                     */
                    function Violation(properties) {
                        this.quotaDimensions = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Violation subject.
                     * @member {string} subject
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.subject = "";
    
                    /**
                     * Violation description.
                     * @member {string} description
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.description = "";
    
                    /**
                     * Violation apiService.
                     * @member {string} apiService
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.apiService = "";
    
                    /**
                     * Violation quotaMetric.
                     * @member {string} quotaMetric
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.quotaMetric = "";
    
                    /**
                     * Violation quotaId.
                     * @member {string} quotaId
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.quotaId = "";
    
                    /**
                     * Violation quotaDimensions.
                     * @member {Object.<string,string>} quotaDimensions
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.quotaDimensions = $util.emptyObject;
    
                    /**
                     * Violation quotaValue.
                     * @member {number|Long} quotaValue
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.quotaValue = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * Violation futureQuotaValue.
                     * @member {number|Long|null|undefined} futureQuotaValue
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     */
                    Violation.prototype.futureQuotaValue = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    // Virtual OneOf for proto3 optional field
                    Object.defineProperty(Violation.prototype, "_futureQuotaValue", {
                        get: $util.oneOfGetter($oneOfFields = ["futureQuotaValue"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new Violation instance using the specified properties.
                     * @function create
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {google.rpc.QuotaFailure.IViolation=} [properties] Properties to set
                     * @returns {google.rpc.QuotaFailure.Violation} Violation instance
                     */
                    Violation.create = function create(properties) {
                        return new Violation(properties);
                    };
    
                    /**
                     * Encodes the specified Violation message. Does not implicitly {@link google.rpc.QuotaFailure.Violation.verify|verify} messages.
                     * @function encode
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {google.rpc.QuotaFailure.IViolation} message Violation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Violation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.subject);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.description);
                        if (message.apiService != null && Object.hasOwnProperty.call(message, "apiService"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.apiService);
                        if (message.quotaMetric != null && Object.hasOwnProperty.call(message, "quotaMetric"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.quotaMetric);
                        if (message.quotaId != null && Object.hasOwnProperty.call(message, "quotaId"))
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.quotaId);
                        if (message.quotaDimensions != null && Object.hasOwnProperty.call(message, "quotaDimensions"))
                            for (var keys = Object.keys(message.quotaDimensions), i = 0; i < keys.length; ++i)
                                writer.uint32(/* id 6, wireType 2 =*/50).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.quotaDimensions[keys[i]]).ldelim();
                        if (message.quotaValue != null && Object.hasOwnProperty.call(message, "quotaValue"))
                            writer.uint32(/* id 7, wireType 0 =*/56).int64(message.quotaValue);
                        if (message.futureQuotaValue != null && Object.hasOwnProperty.call(message, "futureQuotaValue"))
                            writer.uint32(/* id 8, wireType 0 =*/64).int64(message.futureQuotaValue);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Violation message, length delimited. Does not implicitly {@link google.rpc.QuotaFailure.Violation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {google.rpc.QuotaFailure.IViolation} message Violation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Violation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Violation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.rpc.QuotaFailure.Violation} Violation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Violation.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.QuotaFailure.Violation(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.subject = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.description = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.apiService = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.quotaMetric = reader.string();
                                    break;
                                }
                            case 5: {
                                    message.quotaId = reader.string();
                                    break;
                                }
                            case 6: {
                                    if (message.quotaDimensions === $util.emptyObject)
                                        message.quotaDimensions = {};
                                    var end2 = reader.uint32() + reader.pos;
                                    key = "";
                                    value = "";
                                    while (reader.pos < end2) {
                                        var tag2 = reader.uint32();
                                        switch (tag2 >>> 3) {
                                        case 1:
                                            key = reader.string();
                                            break;
                                        case 2:
                                            value = reader.string();
                                            break;
                                        default:
                                            reader.skipType(tag2 & 7);
                                            break;
                                        }
                                    }
                                    message.quotaDimensions[key] = value;
                                    break;
                                }
                            case 7: {
                                    message.quotaValue = reader.int64();
                                    break;
                                }
                            case 8: {
                                    message.futureQuotaValue = reader.int64();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Violation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.rpc.QuotaFailure.Violation} Violation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Violation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Violation message.
                     * @function verify
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Violation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.subject != null && message.hasOwnProperty("subject"))
                            if (!$util.isString(message.subject))
                                return "subject: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.apiService != null && message.hasOwnProperty("apiService"))
                            if (!$util.isString(message.apiService))
                                return "apiService: string expected";
                        if (message.quotaMetric != null && message.hasOwnProperty("quotaMetric"))
                            if (!$util.isString(message.quotaMetric))
                                return "quotaMetric: string expected";
                        if (message.quotaId != null && message.hasOwnProperty("quotaId"))
                            if (!$util.isString(message.quotaId))
                                return "quotaId: string expected";
                        if (message.quotaDimensions != null && message.hasOwnProperty("quotaDimensions")) {
                            if (!$util.isObject(message.quotaDimensions))
                                return "quotaDimensions: object expected";
                            var key = Object.keys(message.quotaDimensions);
                            for (var i = 0; i < key.length; ++i)
                                if (!$util.isString(message.quotaDimensions[key[i]]))
                                    return "quotaDimensions: string{k:string} expected";
                        }
                        if (message.quotaValue != null && message.hasOwnProperty("quotaValue"))
                            if (!$util.isInteger(message.quotaValue) && !(message.quotaValue && $util.isInteger(message.quotaValue.low) && $util.isInteger(message.quotaValue.high)))
                                return "quotaValue: integer|Long expected";
                        if (message.futureQuotaValue != null && message.hasOwnProperty("futureQuotaValue")) {
                            properties._futureQuotaValue = 1;
                            if (!$util.isInteger(message.futureQuotaValue) && !(message.futureQuotaValue && $util.isInteger(message.futureQuotaValue.low) && $util.isInteger(message.futureQuotaValue.high)))
                                return "futureQuotaValue: integer|Long expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Violation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.rpc.QuotaFailure.Violation} Violation
                     */
                    Violation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.rpc.QuotaFailure.Violation)
                            return object;
                        var message = new $root.google.rpc.QuotaFailure.Violation();
                        if (object.subject != null)
                            message.subject = String(object.subject);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.apiService != null)
                            message.apiService = String(object.apiService);
                        if (object.quotaMetric != null)
                            message.quotaMetric = String(object.quotaMetric);
                        if (object.quotaId != null)
                            message.quotaId = String(object.quotaId);
                        if (object.quotaDimensions) {
                            if (typeof object.quotaDimensions !== "object")
                                throw TypeError(".google.rpc.QuotaFailure.Violation.quotaDimensions: object expected");
                            message.quotaDimensions = {};
                            for (var keys = Object.keys(object.quotaDimensions), i = 0; i < keys.length; ++i)
                                message.quotaDimensions[keys[i]] = String(object.quotaDimensions[keys[i]]);
                        }
                        if (object.quotaValue != null)
                            if ($util.Long)
                                (message.quotaValue = $util.Long.fromValue(object.quotaValue)).unsigned = false;
                            else if (typeof object.quotaValue === "string")
                                message.quotaValue = parseInt(object.quotaValue, 10);
                            else if (typeof object.quotaValue === "number")
                                message.quotaValue = object.quotaValue;
                            else if (typeof object.quotaValue === "object")
                                message.quotaValue = new $util.LongBits(object.quotaValue.low >>> 0, object.quotaValue.high >>> 0).toNumber();
                        if (object.futureQuotaValue != null)
                            if ($util.Long)
                                (message.futureQuotaValue = $util.Long.fromValue(object.futureQuotaValue)).unsigned = false;
                            else if (typeof object.futureQuotaValue === "string")
                                message.futureQuotaValue = parseInt(object.futureQuotaValue, 10);
                            else if (typeof object.futureQuotaValue === "number")
                                message.futureQuotaValue = object.futureQuotaValue;
                            else if (typeof object.futureQuotaValue === "object")
                                message.futureQuotaValue = new $util.LongBits(object.futureQuotaValue.low >>> 0, object.futureQuotaValue.high >>> 0).toNumber();
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Violation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {google.rpc.QuotaFailure.Violation} message Violation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Violation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.quotaDimensions = {};
                        if (options.defaults) {
                            object.subject = "";
                            object.description = "";
                            object.apiService = "";
                            object.quotaMetric = "";
                            object.quotaId = "";
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.quotaValue = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.quotaValue = options.longs === String ? "0" : 0;
                        }
                        if (message.subject != null && message.hasOwnProperty("subject"))
                            object.subject = message.subject;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.apiService != null && message.hasOwnProperty("apiService"))
                            object.apiService = message.apiService;
                        if (message.quotaMetric != null && message.hasOwnProperty("quotaMetric"))
                            object.quotaMetric = message.quotaMetric;
                        if (message.quotaId != null && message.hasOwnProperty("quotaId"))
                            object.quotaId = message.quotaId;
                        var keys2;
                        if (message.quotaDimensions && (keys2 = Object.keys(message.quotaDimensions)).length) {
                            object.quotaDimensions = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.quotaDimensions[keys2[j]] = message.quotaDimensions[keys2[j]];
                        }
                        if (message.quotaValue != null && message.hasOwnProperty("quotaValue"))
                            if (typeof message.quotaValue === "number")
                                object.quotaValue = options.longs === String ? String(message.quotaValue) : message.quotaValue;
                            else
                                object.quotaValue = options.longs === String ? $util.Long.prototype.toString.call(message.quotaValue) : options.longs === Number ? new $util.LongBits(message.quotaValue.low >>> 0, message.quotaValue.high >>> 0).toNumber() : message.quotaValue;
                        if (message.futureQuotaValue != null && message.hasOwnProperty("futureQuotaValue")) {
                            if (typeof message.futureQuotaValue === "number")
                                object.futureQuotaValue = options.longs === String ? String(message.futureQuotaValue) : message.futureQuotaValue;
                            else
                                object.futureQuotaValue = options.longs === String ? $util.Long.prototype.toString.call(message.futureQuotaValue) : options.longs === Number ? new $util.LongBits(message.futureQuotaValue.low >>> 0, message.futureQuotaValue.high >>> 0).toNumber() : message.futureQuotaValue;
                            if (options.oneofs)
                                object._futureQuotaValue = "futureQuotaValue";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Violation to JSON.
                     * @function toJSON
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Violation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Violation
                     * @function getTypeUrl
                     * @memberof google.rpc.QuotaFailure.Violation
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Violation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.rpc.QuotaFailure.Violation";
                    };
    
                    return Violation;
                })();
    
                return QuotaFailure;
            })();
    
            rpc.PreconditionFailure = (function() {
    
                /**
                 * Properties of a PreconditionFailure.
                 * @memberof google.rpc
                 * @interface IPreconditionFailure
                 * @property {Array.<google.rpc.PreconditionFailure.IViolation>|null} [violations] PreconditionFailure violations
                 */
    
                /**
                 * Constructs a new PreconditionFailure.
                 * @memberof google.rpc
                 * @classdesc Represents a PreconditionFailure.
                 * @implements IPreconditionFailure
                 * @constructor
                 * @param {google.rpc.IPreconditionFailure=} [properties] Properties to set
                 */
                function PreconditionFailure(properties) {
                    this.violations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * PreconditionFailure violations.
                 * @member {Array.<google.rpc.PreconditionFailure.IViolation>} violations
                 * @memberof google.rpc.PreconditionFailure
                 * @instance
                 */
                PreconditionFailure.prototype.violations = $util.emptyArray;
    
                /**
                 * Creates a new PreconditionFailure instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {google.rpc.IPreconditionFailure=} [properties] Properties to set
                 * @returns {google.rpc.PreconditionFailure} PreconditionFailure instance
                 */
                PreconditionFailure.create = function create(properties) {
                    return new PreconditionFailure(properties);
                };
    
                /**
                 * Encodes the specified PreconditionFailure message. Does not implicitly {@link google.rpc.PreconditionFailure.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {google.rpc.IPreconditionFailure} message PreconditionFailure message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PreconditionFailure.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.violations != null && message.violations.length)
                        for (var i = 0; i < message.violations.length; ++i)
                            $root.google.rpc.PreconditionFailure.Violation.encode(message.violations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified PreconditionFailure message, length delimited. Does not implicitly {@link google.rpc.PreconditionFailure.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {google.rpc.IPreconditionFailure} message PreconditionFailure message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PreconditionFailure.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a PreconditionFailure message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.PreconditionFailure} PreconditionFailure
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PreconditionFailure.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.PreconditionFailure();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.violations && message.violations.length))
                                    message.violations = [];
                                message.violations.push($root.google.rpc.PreconditionFailure.Violation.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a PreconditionFailure message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.PreconditionFailure} PreconditionFailure
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PreconditionFailure.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a PreconditionFailure message.
                 * @function verify
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                PreconditionFailure.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.violations != null && message.hasOwnProperty("violations")) {
                        if (!Array.isArray(message.violations))
                            return "violations: array expected";
                        for (var i = 0; i < message.violations.length; ++i) {
                            var error = $root.google.rpc.PreconditionFailure.Violation.verify(message.violations[i]);
                            if (error)
                                return "violations." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a PreconditionFailure message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.PreconditionFailure} PreconditionFailure
                 */
                PreconditionFailure.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.PreconditionFailure)
                        return object;
                    var message = new $root.google.rpc.PreconditionFailure();
                    if (object.violations) {
                        if (!Array.isArray(object.violations))
                            throw TypeError(".google.rpc.PreconditionFailure.violations: array expected");
                        message.violations = [];
                        for (var i = 0; i < object.violations.length; ++i) {
                            if (typeof object.violations[i] !== "object")
                                throw TypeError(".google.rpc.PreconditionFailure.violations: object expected");
                            message.violations[i] = $root.google.rpc.PreconditionFailure.Violation.fromObject(object.violations[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a PreconditionFailure message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {google.rpc.PreconditionFailure} message PreconditionFailure
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                PreconditionFailure.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.violations = [];
                    if (message.violations && message.violations.length) {
                        object.violations = [];
                        for (var j = 0; j < message.violations.length; ++j)
                            object.violations[j] = $root.google.rpc.PreconditionFailure.Violation.toObject(message.violations[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this PreconditionFailure to JSON.
                 * @function toJSON
                 * @memberof google.rpc.PreconditionFailure
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                PreconditionFailure.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for PreconditionFailure
                 * @function getTypeUrl
                 * @memberof google.rpc.PreconditionFailure
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                PreconditionFailure.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.PreconditionFailure";
                };
    
                PreconditionFailure.Violation = (function() {
    
                    /**
                     * Properties of a Violation.
                     * @memberof google.rpc.PreconditionFailure
                     * @interface IViolation
                     * @property {string|null} [type] Violation type
                     * @property {string|null} [subject] Violation subject
                     * @property {string|null} [description] Violation description
                     */
    
                    /**
                     * Constructs a new Violation.
                     * @memberof google.rpc.PreconditionFailure
                     * @classdesc Represents a Violation.
                     * @implements IViolation
                     * @constructor
                     * @param {google.rpc.PreconditionFailure.IViolation=} [properties] Properties to set
                     */
                    function Violation(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Violation type.
                     * @member {string} type
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @instance
                     */
                    Violation.prototype.type = "";
    
                    /**
                     * Violation subject.
                     * @member {string} subject
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @instance
                     */
                    Violation.prototype.subject = "";
    
                    /**
                     * Violation description.
                     * @member {string} description
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @instance
                     */
                    Violation.prototype.description = "";
    
                    /**
                     * Creates a new Violation instance using the specified properties.
                     * @function create
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {google.rpc.PreconditionFailure.IViolation=} [properties] Properties to set
                     * @returns {google.rpc.PreconditionFailure.Violation} Violation instance
                     */
                    Violation.create = function create(properties) {
                        return new Violation(properties);
                    };
    
                    /**
                     * Encodes the specified Violation message. Does not implicitly {@link google.rpc.PreconditionFailure.Violation.verify|verify} messages.
                     * @function encode
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {google.rpc.PreconditionFailure.IViolation} message Violation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Violation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                        if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.subject);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Violation message, length delimited. Does not implicitly {@link google.rpc.PreconditionFailure.Violation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {google.rpc.PreconditionFailure.IViolation} message Violation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Violation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Violation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.rpc.PreconditionFailure.Violation} Violation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Violation.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.PreconditionFailure.Violation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.type = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.subject = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.description = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Violation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.rpc.PreconditionFailure.Violation} Violation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Violation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Violation message.
                     * @function verify
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Violation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.type != null && message.hasOwnProperty("type"))
                            if (!$util.isString(message.type))
                                return "type: string expected";
                        if (message.subject != null && message.hasOwnProperty("subject"))
                            if (!$util.isString(message.subject))
                                return "subject: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a Violation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.rpc.PreconditionFailure.Violation} Violation
                     */
                    Violation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.rpc.PreconditionFailure.Violation)
                            return object;
                        var message = new $root.google.rpc.PreconditionFailure.Violation();
                        if (object.type != null)
                            message.type = String(object.type);
                        if (object.subject != null)
                            message.subject = String(object.subject);
                        if (object.description != null)
                            message.description = String(object.description);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Violation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {google.rpc.PreconditionFailure.Violation} message Violation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Violation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.type = "";
                            object.subject = "";
                            object.description = "";
                        }
                        if (message.type != null && message.hasOwnProperty("type"))
                            object.type = message.type;
                        if (message.subject != null && message.hasOwnProperty("subject"))
                            object.subject = message.subject;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        return object;
                    };
    
                    /**
                     * Converts this Violation to JSON.
                     * @function toJSON
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Violation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Violation
                     * @function getTypeUrl
                     * @memberof google.rpc.PreconditionFailure.Violation
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Violation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.rpc.PreconditionFailure.Violation";
                    };
    
                    return Violation;
                })();
    
                return PreconditionFailure;
            })();
    
            rpc.BadRequest = (function() {
    
                /**
                 * Properties of a BadRequest.
                 * @memberof google.rpc
                 * @interface IBadRequest
                 * @property {Array.<google.rpc.BadRequest.IFieldViolation>|null} [fieldViolations] BadRequest fieldViolations
                 */
    
                /**
                 * Constructs a new BadRequest.
                 * @memberof google.rpc
                 * @classdesc Represents a BadRequest.
                 * @implements IBadRequest
                 * @constructor
                 * @param {google.rpc.IBadRequest=} [properties] Properties to set
                 */
                function BadRequest(properties) {
                    this.fieldViolations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * BadRequest fieldViolations.
                 * @member {Array.<google.rpc.BadRequest.IFieldViolation>} fieldViolations
                 * @memberof google.rpc.BadRequest
                 * @instance
                 */
                BadRequest.prototype.fieldViolations = $util.emptyArray;
    
                /**
                 * Creates a new BadRequest instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {google.rpc.IBadRequest=} [properties] Properties to set
                 * @returns {google.rpc.BadRequest} BadRequest instance
                 */
                BadRequest.create = function create(properties) {
                    return new BadRequest(properties);
                };
    
                /**
                 * Encodes the specified BadRequest message. Does not implicitly {@link google.rpc.BadRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {google.rpc.IBadRequest} message BadRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                BadRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.fieldViolations != null && message.fieldViolations.length)
                        for (var i = 0; i < message.fieldViolations.length; ++i)
                            $root.google.rpc.BadRequest.FieldViolation.encode(message.fieldViolations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified BadRequest message, length delimited. Does not implicitly {@link google.rpc.BadRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {google.rpc.IBadRequest} message BadRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                BadRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a BadRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.BadRequest} BadRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                BadRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.BadRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.fieldViolations && message.fieldViolations.length))
                                    message.fieldViolations = [];
                                message.fieldViolations.push($root.google.rpc.BadRequest.FieldViolation.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a BadRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.BadRequest} BadRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                BadRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a BadRequest message.
                 * @function verify
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                BadRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.fieldViolations != null && message.hasOwnProperty("fieldViolations")) {
                        if (!Array.isArray(message.fieldViolations))
                            return "fieldViolations: array expected";
                        for (var i = 0; i < message.fieldViolations.length; ++i) {
                            var error = $root.google.rpc.BadRequest.FieldViolation.verify(message.fieldViolations[i]);
                            if (error)
                                return "fieldViolations." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a BadRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.BadRequest} BadRequest
                 */
                BadRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.BadRequest)
                        return object;
                    var message = new $root.google.rpc.BadRequest();
                    if (object.fieldViolations) {
                        if (!Array.isArray(object.fieldViolations))
                            throw TypeError(".google.rpc.BadRequest.fieldViolations: array expected");
                        message.fieldViolations = [];
                        for (var i = 0; i < object.fieldViolations.length; ++i) {
                            if (typeof object.fieldViolations[i] !== "object")
                                throw TypeError(".google.rpc.BadRequest.fieldViolations: object expected");
                            message.fieldViolations[i] = $root.google.rpc.BadRequest.FieldViolation.fromObject(object.fieldViolations[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a BadRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {google.rpc.BadRequest} message BadRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                BadRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.fieldViolations = [];
                    if (message.fieldViolations && message.fieldViolations.length) {
                        object.fieldViolations = [];
                        for (var j = 0; j < message.fieldViolations.length; ++j)
                            object.fieldViolations[j] = $root.google.rpc.BadRequest.FieldViolation.toObject(message.fieldViolations[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this BadRequest to JSON.
                 * @function toJSON
                 * @memberof google.rpc.BadRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                BadRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for BadRequest
                 * @function getTypeUrl
                 * @memberof google.rpc.BadRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                BadRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.BadRequest";
                };
    
                BadRequest.FieldViolation = (function() {
    
                    /**
                     * Properties of a FieldViolation.
                     * @memberof google.rpc.BadRequest
                     * @interface IFieldViolation
                     * @property {string|null} [field] FieldViolation field
                     * @property {string|null} [description] FieldViolation description
                     * @property {string|null} [reason] FieldViolation reason
                     * @property {google.rpc.ILocalizedMessage|null} [localizedMessage] FieldViolation localizedMessage
                     */
    
                    /**
                     * Constructs a new FieldViolation.
                     * @memberof google.rpc.BadRequest
                     * @classdesc Represents a FieldViolation.
                     * @implements IFieldViolation
                     * @constructor
                     * @param {google.rpc.BadRequest.IFieldViolation=} [properties] Properties to set
                     */
                    function FieldViolation(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * FieldViolation field.
                     * @member {string} field
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @instance
                     */
                    FieldViolation.prototype.field = "";
    
                    /**
                     * FieldViolation description.
                     * @member {string} description
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @instance
                     */
                    FieldViolation.prototype.description = "";
    
                    /**
                     * FieldViolation reason.
                     * @member {string} reason
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @instance
                     */
                    FieldViolation.prototype.reason = "";
    
                    /**
                     * FieldViolation localizedMessage.
                     * @member {google.rpc.ILocalizedMessage|null|undefined} localizedMessage
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @instance
                     */
                    FieldViolation.prototype.localizedMessage = null;
    
                    /**
                     * Creates a new FieldViolation instance using the specified properties.
                     * @function create
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {google.rpc.BadRequest.IFieldViolation=} [properties] Properties to set
                     * @returns {google.rpc.BadRequest.FieldViolation} FieldViolation instance
                     */
                    FieldViolation.create = function create(properties) {
                        return new FieldViolation(properties);
                    };
    
                    /**
                     * Encodes the specified FieldViolation message. Does not implicitly {@link google.rpc.BadRequest.FieldViolation.verify|verify} messages.
                     * @function encode
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {google.rpc.BadRequest.IFieldViolation} message FieldViolation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FieldViolation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.field != null && Object.hasOwnProperty.call(message, "field"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.field);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.description);
                        if (message.reason != null && Object.hasOwnProperty.call(message, "reason"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.reason);
                        if (message.localizedMessage != null && Object.hasOwnProperty.call(message, "localizedMessage"))
                            $root.google.rpc.LocalizedMessage.encode(message.localizedMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified FieldViolation message, length delimited. Does not implicitly {@link google.rpc.BadRequest.FieldViolation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {google.rpc.BadRequest.IFieldViolation} message FieldViolation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    FieldViolation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a FieldViolation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.rpc.BadRequest.FieldViolation} FieldViolation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FieldViolation.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.BadRequest.FieldViolation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.field = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.description = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.reason = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.localizedMessage = $root.google.rpc.LocalizedMessage.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a FieldViolation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.rpc.BadRequest.FieldViolation} FieldViolation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    FieldViolation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a FieldViolation message.
                     * @function verify
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    FieldViolation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.field != null && message.hasOwnProperty("field"))
                            if (!$util.isString(message.field))
                                return "field: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.reason != null && message.hasOwnProperty("reason"))
                            if (!$util.isString(message.reason))
                                return "reason: string expected";
                        if (message.localizedMessage != null && message.hasOwnProperty("localizedMessage")) {
                            var error = $root.google.rpc.LocalizedMessage.verify(message.localizedMessage);
                            if (error)
                                return "localizedMessage." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a FieldViolation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.rpc.BadRequest.FieldViolation} FieldViolation
                     */
                    FieldViolation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.rpc.BadRequest.FieldViolation)
                            return object;
                        var message = new $root.google.rpc.BadRequest.FieldViolation();
                        if (object.field != null)
                            message.field = String(object.field);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.reason != null)
                            message.reason = String(object.reason);
                        if (object.localizedMessage != null) {
                            if (typeof object.localizedMessage !== "object")
                                throw TypeError(".google.rpc.BadRequest.FieldViolation.localizedMessage: object expected");
                            message.localizedMessage = $root.google.rpc.LocalizedMessage.fromObject(object.localizedMessage);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a FieldViolation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {google.rpc.BadRequest.FieldViolation} message FieldViolation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    FieldViolation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.field = "";
                            object.description = "";
                            object.reason = "";
                            object.localizedMessage = null;
                        }
                        if (message.field != null && message.hasOwnProperty("field"))
                            object.field = message.field;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.reason != null && message.hasOwnProperty("reason"))
                            object.reason = message.reason;
                        if (message.localizedMessage != null && message.hasOwnProperty("localizedMessage"))
                            object.localizedMessage = $root.google.rpc.LocalizedMessage.toObject(message.localizedMessage, options);
                        return object;
                    };
    
                    /**
                     * Converts this FieldViolation to JSON.
                     * @function toJSON
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    FieldViolation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for FieldViolation
                     * @function getTypeUrl
                     * @memberof google.rpc.BadRequest.FieldViolation
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    FieldViolation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.rpc.BadRequest.FieldViolation";
                    };
    
                    return FieldViolation;
                })();
    
                return BadRequest;
            })();
    
            rpc.RequestInfo = (function() {
    
                /**
                 * Properties of a RequestInfo.
                 * @memberof google.rpc
                 * @interface IRequestInfo
                 * @property {string|null} [requestId] RequestInfo requestId
                 * @property {string|null} [servingData] RequestInfo servingData
                 */
    
                /**
                 * Constructs a new RequestInfo.
                 * @memberof google.rpc
                 * @classdesc Represents a RequestInfo.
                 * @implements IRequestInfo
                 * @constructor
                 * @param {google.rpc.IRequestInfo=} [properties] Properties to set
                 */
                function RequestInfo(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * RequestInfo requestId.
                 * @member {string} requestId
                 * @memberof google.rpc.RequestInfo
                 * @instance
                 */
                RequestInfo.prototype.requestId = "";
    
                /**
                 * RequestInfo servingData.
                 * @member {string} servingData
                 * @memberof google.rpc.RequestInfo
                 * @instance
                 */
                RequestInfo.prototype.servingData = "";
    
                /**
                 * Creates a new RequestInfo instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {google.rpc.IRequestInfo=} [properties] Properties to set
                 * @returns {google.rpc.RequestInfo} RequestInfo instance
                 */
                RequestInfo.create = function create(properties) {
                    return new RequestInfo(properties);
                };
    
                /**
                 * Encodes the specified RequestInfo message. Does not implicitly {@link google.rpc.RequestInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {google.rpc.IRequestInfo} message RequestInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RequestInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.requestId != null && Object.hasOwnProperty.call(message, "requestId"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.requestId);
                    if (message.servingData != null && Object.hasOwnProperty.call(message, "servingData"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.servingData);
                    return writer;
                };
    
                /**
                 * Encodes the specified RequestInfo message, length delimited. Does not implicitly {@link google.rpc.RequestInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {google.rpc.IRequestInfo} message RequestInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RequestInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a RequestInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.RequestInfo} RequestInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RequestInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.RequestInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.requestId = reader.string();
                                break;
                            }
                        case 2: {
                                message.servingData = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a RequestInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.RequestInfo} RequestInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RequestInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a RequestInfo message.
                 * @function verify
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                RequestInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.requestId != null && message.hasOwnProperty("requestId"))
                        if (!$util.isString(message.requestId))
                            return "requestId: string expected";
                    if (message.servingData != null && message.hasOwnProperty("servingData"))
                        if (!$util.isString(message.servingData))
                            return "servingData: string expected";
                    return null;
                };
    
                /**
                 * Creates a RequestInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.RequestInfo} RequestInfo
                 */
                RequestInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.RequestInfo)
                        return object;
                    var message = new $root.google.rpc.RequestInfo();
                    if (object.requestId != null)
                        message.requestId = String(object.requestId);
                    if (object.servingData != null)
                        message.servingData = String(object.servingData);
                    return message;
                };
    
                /**
                 * Creates a plain object from a RequestInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {google.rpc.RequestInfo} message RequestInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                RequestInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.requestId = "";
                        object.servingData = "";
                    }
                    if (message.requestId != null && message.hasOwnProperty("requestId"))
                        object.requestId = message.requestId;
                    if (message.servingData != null && message.hasOwnProperty("servingData"))
                        object.servingData = message.servingData;
                    return object;
                };
    
                /**
                 * Converts this RequestInfo to JSON.
                 * @function toJSON
                 * @memberof google.rpc.RequestInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                RequestInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for RequestInfo
                 * @function getTypeUrl
                 * @memberof google.rpc.RequestInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                RequestInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.RequestInfo";
                };
    
                return RequestInfo;
            })();
    
            rpc.ResourceInfo = (function() {
    
                /**
                 * Properties of a ResourceInfo.
                 * @memberof google.rpc
                 * @interface IResourceInfo
                 * @property {string|null} [resourceType] ResourceInfo resourceType
                 * @property {string|null} [resourceName] ResourceInfo resourceName
                 * @property {string|null} [owner] ResourceInfo owner
                 * @property {string|null} [description] ResourceInfo description
                 */
    
                /**
                 * Constructs a new ResourceInfo.
                 * @memberof google.rpc
                 * @classdesc Represents a ResourceInfo.
                 * @implements IResourceInfo
                 * @constructor
                 * @param {google.rpc.IResourceInfo=} [properties] Properties to set
                 */
                function ResourceInfo(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ResourceInfo resourceType.
                 * @member {string} resourceType
                 * @memberof google.rpc.ResourceInfo
                 * @instance
                 */
                ResourceInfo.prototype.resourceType = "";
    
                /**
                 * ResourceInfo resourceName.
                 * @member {string} resourceName
                 * @memberof google.rpc.ResourceInfo
                 * @instance
                 */
                ResourceInfo.prototype.resourceName = "";
    
                /**
                 * ResourceInfo owner.
                 * @member {string} owner
                 * @memberof google.rpc.ResourceInfo
                 * @instance
                 */
                ResourceInfo.prototype.owner = "";
    
                /**
                 * ResourceInfo description.
                 * @member {string} description
                 * @memberof google.rpc.ResourceInfo
                 * @instance
                 */
                ResourceInfo.prototype.description = "";
    
                /**
                 * Creates a new ResourceInfo instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {google.rpc.IResourceInfo=} [properties] Properties to set
                 * @returns {google.rpc.ResourceInfo} ResourceInfo instance
                 */
                ResourceInfo.create = function create(properties) {
                    return new ResourceInfo(properties);
                };
    
                /**
                 * Encodes the specified ResourceInfo message. Does not implicitly {@link google.rpc.ResourceInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {google.rpc.IResourceInfo} message ResourceInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.resourceType != null && Object.hasOwnProperty.call(message, "resourceType"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.resourceType);
                    if (message.resourceName != null && Object.hasOwnProperty.call(message, "resourceName"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.resourceName);
                    if (message.owner != null && Object.hasOwnProperty.call(message, "owner"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.owner);
                    if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.description);
                    return writer;
                };
    
                /**
                 * Encodes the specified ResourceInfo message, length delimited. Does not implicitly {@link google.rpc.ResourceInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {google.rpc.IResourceInfo} message ResourceInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ResourceInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.ResourceInfo} ResourceInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.ResourceInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.resourceType = reader.string();
                                break;
                            }
                        case 2: {
                                message.resourceName = reader.string();
                                break;
                            }
                        case 3: {
                                message.owner = reader.string();
                                break;
                            }
                        case 4: {
                                message.description = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ResourceInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.ResourceInfo} ResourceInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ResourceInfo message.
                 * @function verify
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ResourceInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.resourceType != null && message.hasOwnProperty("resourceType"))
                        if (!$util.isString(message.resourceType))
                            return "resourceType: string expected";
                    if (message.resourceName != null && message.hasOwnProperty("resourceName"))
                        if (!$util.isString(message.resourceName))
                            return "resourceName: string expected";
                    if (message.owner != null && message.hasOwnProperty("owner"))
                        if (!$util.isString(message.owner))
                            return "owner: string expected";
                    if (message.description != null && message.hasOwnProperty("description"))
                        if (!$util.isString(message.description))
                            return "description: string expected";
                    return null;
                };
    
                /**
                 * Creates a ResourceInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.ResourceInfo} ResourceInfo
                 */
                ResourceInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.ResourceInfo)
                        return object;
                    var message = new $root.google.rpc.ResourceInfo();
                    if (object.resourceType != null)
                        message.resourceType = String(object.resourceType);
                    if (object.resourceName != null)
                        message.resourceName = String(object.resourceName);
                    if (object.owner != null)
                        message.owner = String(object.owner);
                    if (object.description != null)
                        message.description = String(object.description);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ResourceInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {google.rpc.ResourceInfo} message ResourceInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ResourceInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.resourceType = "";
                        object.resourceName = "";
                        object.owner = "";
                        object.description = "";
                    }
                    if (message.resourceType != null && message.hasOwnProperty("resourceType"))
                        object.resourceType = message.resourceType;
                    if (message.resourceName != null && message.hasOwnProperty("resourceName"))
                        object.resourceName = message.resourceName;
                    if (message.owner != null && message.hasOwnProperty("owner"))
                        object.owner = message.owner;
                    if (message.description != null && message.hasOwnProperty("description"))
                        object.description = message.description;
                    return object;
                };
    
                /**
                 * Converts this ResourceInfo to JSON.
                 * @function toJSON
                 * @memberof google.rpc.ResourceInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ResourceInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ResourceInfo
                 * @function getTypeUrl
                 * @memberof google.rpc.ResourceInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ResourceInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.ResourceInfo";
                };
    
                return ResourceInfo;
            })();
    
            rpc.Help = (function() {
    
                /**
                 * Properties of a Help.
                 * @memberof google.rpc
                 * @interface IHelp
                 * @property {Array.<google.rpc.Help.ILink>|null} [links] Help links
                 */
    
                /**
                 * Constructs a new Help.
                 * @memberof google.rpc
                 * @classdesc Represents a Help.
                 * @implements IHelp
                 * @constructor
                 * @param {google.rpc.IHelp=} [properties] Properties to set
                 */
                function Help(properties) {
                    this.links = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Help links.
                 * @member {Array.<google.rpc.Help.ILink>} links
                 * @memberof google.rpc.Help
                 * @instance
                 */
                Help.prototype.links = $util.emptyArray;
    
                /**
                 * Creates a new Help instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.Help
                 * @static
                 * @param {google.rpc.IHelp=} [properties] Properties to set
                 * @returns {google.rpc.Help} Help instance
                 */
                Help.create = function create(properties) {
                    return new Help(properties);
                };
    
                /**
                 * Encodes the specified Help message. Does not implicitly {@link google.rpc.Help.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.Help
                 * @static
                 * @param {google.rpc.IHelp} message Help message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Help.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.links != null && message.links.length)
                        for (var i = 0; i < message.links.length; ++i)
                            $root.google.rpc.Help.Link.encode(message.links[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Help message, length delimited. Does not implicitly {@link google.rpc.Help.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.Help
                 * @static
                 * @param {google.rpc.IHelp} message Help message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Help.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Help message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.Help
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.Help} Help
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Help.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.Help();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.links && message.links.length))
                                    message.links = [];
                                message.links.push($root.google.rpc.Help.Link.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Help message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.Help
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.Help} Help
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Help.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Help message.
                 * @function verify
                 * @memberof google.rpc.Help
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Help.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.links != null && message.hasOwnProperty("links")) {
                        if (!Array.isArray(message.links))
                            return "links: array expected";
                        for (var i = 0; i < message.links.length; ++i) {
                            var error = $root.google.rpc.Help.Link.verify(message.links[i]);
                            if (error)
                                return "links." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Help message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.Help
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.Help} Help
                 */
                Help.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.Help)
                        return object;
                    var message = new $root.google.rpc.Help();
                    if (object.links) {
                        if (!Array.isArray(object.links))
                            throw TypeError(".google.rpc.Help.links: array expected");
                        message.links = [];
                        for (var i = 0; i < object.links.length; ++i) {
                            if (typeof object.links[i] !== "object")
                                throw TypeError(".google.rpc.Help.links: object expected");
                            message.links[i] = $root.google.rpc.Help.Link.fromObject(object.links[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Help message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.Help
                 * @static
                 * @param {google.rpc.Help} message Help
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Help.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.links = [];
                    if (message.links && message.links.length) {
                        object.links = [];
                        for (var j = 0; j < message.links.length; ++j)
                            object.links[j] = $root.google.rpc.Help.Link.toObject(message.links[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Help to JSON.
                 * @function toJSON
                 * @memberof google.rpc.Help
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Help.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Help
                 * @function getTypeUrl
                 * @memberof google.rpc.Help
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Help.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.Help";
                };
    
                Help.Link = (function() {
    
                    /**
                     * Properties of a Link.
                     * @memberof google.rpc.Help
                     * @interface ILink
                     * @property {string|null} [description] Link description
                     * @property {string|null} [url] Link url
                     */
    
                    /**
                     * Constructs a new Link.
                     * @memberof google.rpc.Help
                     * @classdesc Represents a Link.
                     * @implements ILink
                     * @constructor
                     * @param {google.rpc.Help.ILink=} [properties] Properties to set
                     */
                    function Link(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Link description.
                     * @member {string} description
                     * @memberof google.rpc.Help.Link
                     * @instance
                     */
                    Link.prototype.description = "";
    
                    /**
                     * Link url.
                     * @member {string} url
                     * @memberof google.rpc.Help.Link
                     * @instance
                     */
                    Link.prototype.url = "";
    
                    /**
                     * Creates a new Link instance using the specified properties.
                     * @function create
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {google.rpc.Help.ILink=} [properties] Properties to set
                     * @returns {google.rpc.Help.Link} Link instance
                     */
                    Link.create = function create(properties) {
                        return new Link(properties);
                    };
    
                    /**
                     * Encodes the specified Link message. Does not implicitly {@link google.rpc.Help.Link.verify|verify} messages.
                     * @function encode
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {google.rpc.Help.ILink} message Link message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Link.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.description);
                        if (message.url != null && Object.hasOwnProperty.call(message, "url"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.url);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Link message, length delimited. Does not implicitly {@link google.rpc.Help.Link.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {google.rpc.Help.ILink} message Link message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Link.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Link message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.rpc.Help.Link} Link
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Link.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.Help.Link();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.description = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.url = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Link message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.rpc.Help.Link} Link
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Link.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Link message.
                     * @function verify
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Link.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.url != null && message.hasOwnProperty("url"))
                            if (!$util.isString(message.url))
                                return "url: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a Link message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.rpc.Help.Link} Link
                     */
                    Link.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.rpc.Help.Link)
                            return object;
                        var message = new $root.google.rpc.Help.Link();
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.url != null)
                            message.url = String(object.url);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Link message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {google.rpc.Help.Link} message Link
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Link.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.description = "";
                            object.url = "";
                        }
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.url != null && message.hasOwnProperty("url"))
                            object.url = message.url;
                        return object;
                    };
    
                    /**
                     * Converts this Link to JSON.
                     * @function toJSON
                     * @memberof google.rpc.Help.Link
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Link.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Link
                     * @function getTypeUrl
                     * @memberof google.rpc.Help.Link
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Link.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.rpc.Help.Link";
                    };
    
                    return Link;
                })();
    
                return Help;
            })();
    
            rpc.LocalizedMessage = (function() {
    
                /**
                 * Properties of a LocalizedMessage.
                 * @memberof google.rpc
                 * @interface ILocalizedMessage
                 * @property {string|null} [locale] LocalizedMessage locale
                 * @property {string|null} [message] LocalizedMessage message
                 */
    
                /**
                 * Constructs a new LocalizedMessage.
                 * @memberof google.rpc
                 * @classdesc Represents a LocalizedMessage.
                 * @implements ILocalizedMessage
                 * @constructor
                 * @param {google.rpc.ILocalizedMessage=} [properties] Properties to set
                 */
                function LocalizedMessage(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * LocalizedMessage locale.
                 * @member {string} locale
                 * @memberof google.rpc.LocalizedMessage
                 * @instance
                 */
                LocalizedMessage.prototype.locale = "";
    
                /**
                 * LocalizedMessage message.
                 * @member {string} message
                 * @memberof google.rpc.LocalizedMessage
                 * @instance
                 */
                LocalizedMessage.prototype.message = "";
    
                /**
                 * Creates a new LocalizedMessage instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {google.rpc.ILocalizedMessage=} [properties] Properties to set
                 * @returns {google.rpc.LocalizedMessage} LocalizedMessage instance
                 */
                LocalizedMessage.create = function create(properties) {
                    return new LocalizedMessage(properties);
                };
    
                /**
                 * Encodes the specified LocalizedMessage message. Does not implicitly {@link google.rpc.LocalizedMessage.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {google.rpc.ILocalizedMessage} message LocalizedMessage message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                LocalizedMessage.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.locale != null && Object.hasOwnProperty.call(message, "locale"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.locale);
                    if (message.message != null && Object.hasOwnProperty.call(message, "message"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.message);
                    return writer;
                };
    
                /**
                 * Encodes the specified LocalizedMessage message, length delimited. Does not implicitly {@link google.rpc.LocalizedMessage.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {google.rpc.ILocalizedMessage} message LocalizedMessage message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                LocalizedMessage.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a LocalizedMessage message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.LocalizedMessage} LocalizedMessage
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                LocalizedMessage.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.LocalizedMessage();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.locale = reader.string();
                                break;
                            }
                        case 2: {
                                message.message = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a LocalizedMessage message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.LocalizedMessage} LocalizedMessage
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                LocalizedMessage.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a LocalizedMessage message.
                 * @function verify
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                LocalizedMessage.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.locale != null && message.hasOwnProperty("locale"))
                        if (!$util.isString(message.locale))
                            return "locale: string expected";
                    if (message.message != null && message.hasOwnProperty("message"))
                        if (!$util.isString(message.message))
                            return "message: string expected";
                    return null;
                };
    
                /**
                 * Creates a LocalizedMessage message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.LocalizedMessage} LocalizedMessage
                 */
                LocalizedMessage.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.LocalizedMessage)
                        return object;
                    var message = new $root.google.rpc.LocalizedMessage();
                    if (object.locale != null)
                        message.locale = String(object.locale);
                    if (object.message != null)
                        message.message = String(object.message);
                    return message;
                };
    
                /**
                 * Creates a plain object from a LocalizedMessage message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {google.rpc.LocalizedMessage} message LocalizedMessage
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                LocalizedMessage.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.locale = "";
                        object.message = "";
                    }
                    if (message.locale != null && message.hasOwnProperty("locale"))
                        object.locale = message.locale;
                    if (message.message != null && message.hasOwnProperty("message"))
                        object.message = message.message;
                    return object;
                };
    
                /**
                 * Converts this LocalizedMessage to JSON.
                 * @function toJSON
                 * @memberof google.rpc.LocalizedMessage
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                LocalizedMessage.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for LocalizedMessage
                 * @function getTypeUrl
                 * @memberof google.rpc.LocalizedMessage
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                LocalizedMessage.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.LocalizedMessage";
                };
    
                return LocalizedMessage;
            })();
    
            rpc.Status = (function() {
    
                /**
                 * Properties of a Status.
                 * @memberof google.rpc
                 * @interface IStatus
                 * @property {number|null} [code] Status code
                 * @property {string|null} [message] Status message
                 * @property {Array.<google.protobuf.IAny>|null} [details] Status details
                 */
    
                /**
                 * Constructs a new Status.
                 * @memberof google.rpc
                 * @classdesc Represents a Status.
                 * @implements IStatus
                 * @constructor
                 * @param {google.rpc.IStatus=} [properties] Properties to set
                 */
                function Status(properties) {
                    this.details = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Status code.
                 * @member {number} code
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.code = 0;
    
                /**
                 * Status message.
                 * @member {string} message
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.message = "";
    
                /**
                 * Status details.
                 * @member {Array.<google.protobuf.IAny>} details
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.details = $util.emptyArray;
    
                /**
                 * Creates a new Status instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus=} [properties] Properties to set
                 * @returns {google.rpc.Status} Status instance
                 */
                Status.create = function create(properties) {
                    return new Status(properties);
                };
    
                /**
                 * Encodes the specified Status message. Does not implicitly {@link google.rpc.Status.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus} message Status message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Status.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.code != null && Object.hasOwnProperty.call(message, "code"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.code);
                    if (message.message != null && Object.hasOwnProperty.call(message, "message"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.message);
                    if (message.details != null && message.details.length)
                        for (var i = 0; i < message.details.length; ++i)
                            $root.google.protobuf.Any.encode(message.details[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Status message, length delimited. Does not implicitly {@link google.rpc.Status.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus} message Status message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Status.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Status message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.Status
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.Status} Status
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Status.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.Status();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.code = reader.int32();
                                break;
                            }
                        case 2: {
                                message.message = reader.string();
                                break;
                            }
                        case 3: {
                                if (!(message.details && message.details.length))
                                    message.details = [];
                                message.details.push($root.google.protobuf.Any.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Status message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.Status
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.Status} Status
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Status.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Status message.
                 * @function verify
                 * @memberof google.rpc.Status
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Status.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.code != null && message.hasOwnProperty("code"))
                        if (!$util.isInteger(message.code))
                            return "code: integer expected";
                    if (message.message != null && message.hasOwnProperty("message"))
                        if (!$util.isString(message.message))
                            return "message: string expected";
                    if (message.details != null && message.hasOwnProperty("details")) {
                        if (!Array.isArray(message.details))
                            return "details: array expected";
                        for (var i = 0; i < message.details.length; ++i) {
                            var error = $root.google.protobuf.Any.verify(message.details[i]);
                            if (error)
                                return "details." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Status message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.Status
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.Status} Status
                 */
                Status.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.Status)
                        return object;
                    var message = new $root.google.rpc.Status();
                    if (object.code != null)
                        message.code = object.code | 0;
                    if (object.message != null)
                        message.message = String(object.message);
                    if (object.details) {
                        if (!Array.isArray(object.details))
                            throw TypeError(".google.rpc.Status.details: array expected");
                        message.details = [];
                        for (var i = 0; i < object.details.length; ++i) {
                            if (typeof object.details[i] !== "object")
                                throw TypeError(".google.rpc.Status.details: object expected");
                            message.details[i] = $root.google.protobuf.Any.fromObject(object.details[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Status message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.Status} message Status
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Status.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.details = [];
                    if (options.defaults) {
                        object.code = 0;
                        object.message = "";
                    }
                    if (message.code != null && message.hasOwnProperty("code"))
                        object.code = message.code;
                    if (message.message != null && message.hasOwnProperty("message"))
                        object.message = message.message;
                    if (message.details && message.details.length) {
                        object.details = [];
                        for (var j = 0; j < message.details.length; ++j)
                            object.details[j] = $root.google.protobuf.Any.toObject(message.details[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Status to JSON.
                 * @function toJSON
                 * @memberof google.rpc.Status
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Status.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Status
                 * @function getTypeUrl
                 * @memberof google.rpc.Status
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Status.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.rpc.Status";
                };
    
                return Status;
            })();
    
            return rpc;
        })();
    
        google.spanner = (function() {
    
            /**
             * Namespace spanner.
             * @memberof google
             * @namespace
             */
            var spanner = {};
    
            spanner.admin = (function() {
    
                /**
                 * Namespace admin.
                 * @memberof google.spanner
                 * @namespace
                 */
                var admin = {};
    
                admin.database = (function() {
    
                    /**
                     * Namespace database.
                     * @memberof google.spanner.admin
                     * @namespace
                     */
                    var database = {};
    
                    database.v1 = (function() {
    
                        /**
                         * Namespace v1.
                         * @memberof google.spanner.admin.database
                         * @namespace
                         */
                        var v1 = {};
    
                        v1.Backup = (function() {
    
                            /**
                             * Properties of a Backup.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IBackup
                             * @property {string|null} [database] Backup database
                             * @property {google.protobuf.ITimestamp|null} [versionTime] Backup versionTime
                             * @property {google.protobuf.ITimestamp|null} [expireTime] Backup expireTime
                             * @property {string|null} [name] Backup name
                             * @property {google.protobuf.ITimestamp|null} [createTime] Backup createTime
                             * @property {number|Long|null} [sizeBytes] Backup sizeBytes
                             * @property {number|Long|null} [freeableSizeBytes] Backup freeableSizeBytes
                             * @property {number|Long|null} [exclusiveSizeBytes] Backup exclusiveSizeBytes
                             * @property {google.spanner.admin.database.v1.Backup.State|null} [state] Backup state
                             * @property {Array.<string>|null} [referencingDatabases] Backup referencingDatabases
                             * @property {google.spanner.admin.database.v1.IEncryptionInfo|null} [encryptionInfo] Backup encryptionInfo
                             * @property {Array.<google.spanner.admin.database.v1.IEncryptionInfo>|null} [encryptionInformation] Backup encryptionInformation
                             * @property {google.spanner.admin.database.v1.DatabaseDialect|null} [databaseDialect] Backup databaseDialect
                             * @property {Array.<string>|null} [referencingBackups] Backup referencingBackups
                             * @property {google.protobuf.ITimestamp|null} [maxExpireTime] Backup maxExpireTime
                             * @property {Array.<string>|null} [backupSchedules] Backup backupSchedules
                             * @property {string|null} [incrementalBackupChainId] Backup incrementalBackupChainId
                             * @property {google.protobuf.ITimestamp|null} [oldestVersionTime] Backup oldestVersionTime
                             * @property {Array.<google.spanner.admin.database.v1.IBackupInstancePartition>|null} [instancePartitions] Backup instancePartitions
                             */
    
                            /**
                             * Constructs a new Backup.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a Backup.
                             * @implements IBackup
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IBackup=} [properties] Properties to set
                             */
                            function Backup(properties) {
                                this.referencingDatabases = [];
                                this.encryptionInformation = [];
                                this.referencingBackups = [];
                                this.backupSchedules = [];
                                this.instancePartitions = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Backup database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.database = "";
    
                            /**
                             * Backup versionTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} versionTime
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.versionTime = null;
    
                            /**
                             * Backup expireTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.expireTime = null;
    
                            /**
                             * Backup name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.name = "";
    
                            /**
                             * Backup createTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} createTime
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.createTime = null;
    
                            /**
                             * Backup sizeBytes.
                             * @member {number|Long} sizeBytes
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.sizeBytes = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Backup freeableSizeBytes.
                             * @member {number|Long} freeableSizeBytes
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.freeableSizeBytes = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Backup exclusiveSizeBytes.
                             * @member {number|Long} exclusiveSizeBytes
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.exclusiveSizeBytes = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Backup state.
                             * @member {google.spanner.admin.database.v1.Backup.State} state
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.state = 0;
    
                            /**
                             * Backup referencingDatabases.
                             * @member {Array.<string>} referencingDatabases
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.referencingDatabases = $util.emptyArray;
    
                            /**
                             * Backup encryptionInfo.
                             * @member {google.spanner.admin.database.v1.IEncryptionInfo|null|undefined} encryptionInfo
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.encryptionInfo = null;
    
                            /**
                             * Backup encryptionInformation.
                             * @member {Array.<google.spanner.admin.database.v1.IEncryptionInfo>} encryptionInformation
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.encryptionInformation = $util.emptyArray;
    
                            /**
                             * Backup databaseDialect.
                             * @member {google.spanner.admin.database.v1.DatabaseDialect} databaseDialect
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.databaseDialect = 0;
    
                            /**
                             * Backup referencingBackups.
                             * @member {Array.<string>} referencingBackups
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.referencingBackups = $util.emptyArray;
    
                            /**
                             * Backup maxExpireTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} maxExpireTime
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.maxExpireTime = null;
    
                            /**
                             * Backup backupSchedules.
                             * @member {Array.<string>} backupSchedules
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.backupSchedules = $util.emptyArray;
    
                            /**
                             * Backup incrementalBackupChainId.
                             * @member {string} incrementalBackupChainId
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.incrementalBackupChainId = "";
    
                            /**
                             * Backup oldestVersionTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} oldestVersionTime
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.oldestVersionTime = null;
    
                            /**
                             * Backup instancePartitions.
                             * @member {Array.<google.spanner.admin.database.v1.IBackupInstancePartition>} instancePartitions
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             */
                            Backup.prototype.instancePartitions = $util.emptyArray;
    
                            /**
                             * Creates a new Backup instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackup=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.Backup} Backup instance
                             */
                            Backup.create = function create(properties) {
                                return new Backup(properties);
                            };
    
                            /**
                             * Encodes the specified Backup message. Does not implicitly {@link google.spanner.admin.database.v1.Backup.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackup} message Backup message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Backup.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.database);
                                if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                    $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                                    $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.sizeBytes != null && Object.hasOwnProperty.call(message, "sizeBytes"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int64(message.sizeBytes);
                                if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                                    writer.uint32(/* id 6, wireType 0 =*/48).int32(message.state);
                                if (message.referencingDatabases != null && message.referencingDatabases.length)
                                    for (var i = 0; i < message.referencingDatabases.length; ++i)
                                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.referencingDatabases[i]);
                                if (message.encryptionInfo != null && Object.hasOwnProperty.call(message, "encryptionInfo"))
                                    $root.google.spanner.admin.database.v1.EncryptionInfo.encode(message.encryptionInfo, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                                if (message.versionTime != null && Object.hasOwnProperty.call(message, "versionTime"))
                                    $root.google.protobuf.Timestamp.encode(message.versionTime, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                                if (message.databaseDialect != null && Object.hasOwnProperty.call(message, "databaseDialect"))
                                    writer.uint32(/* id 10, wireType 0 =*/80).int32(message.databaseDialect);
                                if (message.referencingBackups != null && message.referencingBackups.length)
                                    for (var i = 0; i < message.referencingBackups.length; ++i)
                                        writer.uint32(/* id 11, wireType 2 =*/90).string(message.referencingBackups[i]);
                                if (message.maxExpireTime != null && Object.hasOwnProperty.call(message, "maxExpireTime"))
                                    $root.google.protobuf.Timestamp.encode(message.maxExpireTime, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                                if (message.encryptionInformation != null && message.encryptionInformation.length)
                                    for (var i = 0; i < message.encryptionInformation.length; ++i)
                                        $root.google.spanner.admin.database.v1.EncryptionInfo.encode(message.encryptionInformation[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
                                if (message.backupSchedules != null && message.backupSchedules.length)
                                    for (var i = 0; i < message.backupSchedules.length; ++i)
                                        writer.uint32(/* id 14, wireType 2 =*/114).string(message.backupSchedules[i]);
                                if (message.freeableSizeBytes != null && Object.hasOwnProperty.call(message, "freeableSizeBytes"))
                                    writer.uint32(/* id 15, wireType 0 =*/120).int64(message.freeableSizeBytes);
                                if (message.exclusiveSizeBytes != null && Object.hasOwnProperty.call(message, "exclusiveSizeBytes"))
                                    writer.uint32(/* id 16, wireType 0 =*/128).int64(message.exclusiveSizeBytes);
                                if (message.incrementalBackupChainId != null && Object.hasOwnProperty.call(message, "incrementalBackupChainId"))
                                    writer.uint32(/* id 17, wireType 2 =*/138).string(message.incrementalBackupChainId);
                                if (message.oldestVersionTime != null && Object.hasOwnProperty.call(message, "oldestVersionTime"))
                                    $root.google.protobuf.Timestamp.encode(message.oldestVersionTime, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim();
                                if (message.instancePartitions != null && message.instancePartitions.length)
                                    for (var i = 0; i < message.instancePartitions.length; ++i)
                                        $root.google.spanner.admin.database.v1.BackupInstancePartition.encode(message.instancePartitions[i], writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Backup message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.Backup.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackup} message Backup message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Backup.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Backup message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.Backup} Backup
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Backup.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.Backup();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 2: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 9: {
                                            message.versionTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.sizeBytes = reader.int64();
                                            break;
                                        }
                                    case 15: {
                                            message.freeableSizeBytes = reader.int64();
                                            break;
                                        }
                                    case 16: {
                                            message.exclusiveSizeBytes = reader.int64();
                                            break;
                                        }
                                    case 6: {
                                            message.state = reader.int32();
                                            break;
                                        }
                                    case 7: {
                                            if (!(message.referencingDatabases && message.referencingDatabases.length))
                                                message.referencingDatabases = [];
                                            message.referencingDatabases.push(reader.string());
                                            break;
                                        }
                                    case 8: {
                                            message.encryptionInfo = $root.google.spanner.admin.database.v1.EncryptionInfo.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 13: {
                                            if (!(message.encryptionInformation && message.encryptionInformation.length))
                                                message.encryptionInformation = [];
                                            message.encryptionInformation.push($root.google.spanner.admin.database.v1.EncryptionInfo.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 10: {
                                            message.databaseDialect = reader.int32();
                                            break;
                                        }
                                    case 11: {
                                            if (!(message.referencingBackups && message.referencingBackups.length))
                                                message.referencingBackups = [];
                                            message.referencingBackups.push(reader.string());
                                            break;
                                        }
                                    case 12: {
                                            message.maxExpireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 14: {
                                            if (!(message.backupSchedules && message.backupSchedules.length))
                                                message.backupSchedules = [];
                                            message.backupSchedules.push(reader.string());
                                            break;
                                        }
                                    case 17: {
                                            message.incrementalBackupChainId = reader.string();
                                            break;
                                        }
                                    case 18: {
                                            message.oldestVersionTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 19: {
                                            if (!(message.instancePartitions && message.instancePartitions.length))
                                                message.instancePartitions = [];
                                            message.instancePartitions.push($root.google.spanner.admin.database.v1.BackupInstancePartition.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Backup message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.Backup} Backup
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Backup.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Backup message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Backup.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.versionTime != null && message.hasOwnProperty("versionTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.versionTime);
                                    if (error)
                                        return "versionTime." + error;
                                }
                                if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                    if (error)
                                        return "expireTime." + error;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.createTime != null && message.hasOwnProperty("createTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                                    if (error)
                                        return "createTime." + error;
                                }
                                if (message.sizeBytes != null && message.hasOwnProperty("sizeBytes"))
                                    if (!$util.isInteger(message.sizeBytes) && !(message.sizeBytes && $util.isInteger(message.sizeBytes.low) && $util.isInteger(message.sizeBytes.high)))
                                        return "sizeBytes: integer|Long expected";
                                if (message.freeableSizeBytes != null && message.hasOwnProperty("freeableSizeBytes"))
                                    if (!$util.isInteger(message.freeableSizeBytes) && !(message.freeableSizeBytes && $util.isInteger(message.freeableSizeBytes.low) && $util.isInteger(message.freeableSizeBytes.high)))
                                        return "freeableSizeBytes: integer|Long expected";
                                if (message.exclusiveSizeBytes != null && message.hasOwnProperty("exclusiveSizeBytes"))
                                    if (!$util.isInteger(message.exclusiveSizeBytes) && !(message.exclusiveSizeBytes && $util.isInteger(message.exclusiveSizeBytes.low) && $util.isInteger(message.exclusiveSizeBytes.high)))
                                        return "exclusiveSizeBytes: integer|Long expected";
                                if (message.state != null && message.hasOwnProperty("state"))
                                    switch (message.state) {
                                    default:
                                        return "state: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.referencingDatabases != null && message.hasOwnProperty("referencingDatabases")) {
                                    if (!Array.isArray(message.referencingDatabases))
                                        return "referencingDatabases: array expected";
                                    for (var i = 0; i < message.referencingDatabases.length; ++i)
                                        if (!$util.isString(message.referencingDatabases[i]))
                                            return "referencingDatabases: string[] expected";
                                }
                                if (message.encryptionInfo != null && message.hasOwnProperty("encryptionInfo")) {
                                    var error = $root.google.spanner.admin.database.v1.EncryptionInfo.verify(message.encryptionInfo);
                                    if (error)
                                        return "encryptionInfo." + error;
                                }
                                if (message.encryptionInformation != null && message.hasOwnProperty("encryptionInformation")) {
                                    if (!Array.isArray(message.encryptionInformation))
                                        return "encryptionInformation: array expected";
                                    for (var i = 0; i < message.encryptionInformation.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.EncryptionInfo.verify(message.encryptionInformation[i]);
                                        if (error)
                                            return "encryptionInformation." + error;
                                    }
                                }
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    switch (message.databaseDialect) {
                                    default:
                                        return "databaseDialect: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.referencingBackups != null && message.hasOwnProperty("referencingBackups")) {
                                    if (!Array.isArray(message.referencingBackups))
                                        return "referencingBackups: array expected";
                                    for (var i = 0; i < message.referencingBackups.length; ++i)
                                        if (!$util.isString(message.referencingBackups[i]))
                                            return "referencingBackups: string[] expected";
                                }
                                if (message.maxExpireTime != null && message.hasOwnProperty("maxExpireTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.maxExpireTime);
                                    if (error)
                                        return "maxExpireTime." + error;
                                }
                                if (message.backupSchedules != null && message.hasOwnProperty("backupSchedules")) {
                                    if (!Array.isArray(message.backupSchedules))
                                        return "backupSchedules: array expected";
                                    for (var i = 0; i < message.backupSchedules.length; ++i)
                                        if (!$util.isString(message.backupSchedules[i]))
                                            return "backupSchedules: string[] expected";
                                }
                                if (message.incrementalBackupChainId != null && message.hasOwnProperty("incrementalBackupChainId"))
                                    if (!$util.isString(message.incrementalBackupChainId))
                                        return "incrementalBackupChainId: string expected";
                                if (message.oldestVersionTime != null && message.hasOwnProperty("oldestVersionTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.oldestVersionTime);
                                    if (error)
                                        return "oldestVersionTime." + error;
                                }
                                if (message.instancePartitions != null && message.hasOwnProperty("instancePartitions")) {
                                    if (!Array.isArray(message.instancePartitions))
                                        return "instancePartitions: array expected";
                                    for (var i = 0; i < message.instancePartitions.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.BackupInstancePartition.verify(message.instancePartitions[i]);
                                        if (error)
                                            return "instancePartitions." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates a Backup message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.Backup} Backup
                             */
                            Backup.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.Backup)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.Backup();
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.versionTime != null) {
                                    if (typeof object.versionTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.versionTime: object expected");
                                    message.versionTime = $root.google.protobuf.Timestamp.fromObject(object.versionTime);
                                }
                                if (object.expireTime != null) {
                                    if (typeof object.expireTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.expireTime: object expected");
                                    message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                                }
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.createTime != null) {
                                    if (typeof object.createTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.createTime: object expected");
                                    message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                                }
                                if (object.sizeBytes != null)
                                    if ($util.Long)
                                        (message.sizeBytes = $util.Long.fromValue(object.sizeBytes)).unsigned = false;
                                    else if (typeof object.sizeBytes === "string")
                                        message.sizeBytes = parseInt(object.sizeBytes, 10);
                                    else if (typeof object.sizeBytes === "number")
                                        message.sizeBytes = object.sizeBytes;
                                    else if (typeof object.sizeBytes === "object")
                                        message.sizeBytes = new $util.LongBits(object.sizeBytes.low >>> 0, object.sizeBytes.high >>> 0).toNumber();
                                if (object.freeableSizeBytes != null)
                                    if ($util.Long)
                                        (message.freeableSizeBytes = $util.Long.fromValue(object.freeableSizeBytes)).unsigned = false;
                                    else if (typeof object.freeableSizeBytes === "string")
                                        message.freeableSizeBytes = parseInt(object.freeableSizeBytes, 10);
                                    else if (typeof object.freeableSizeBytes === "number")
                                        message.freeableSizeBytes = object.freeableSizeBytes;
                                    else if (typeof object.freeableSizeBytes === "object")
                                        message.freeableSizeBytes = new $util.LongBits(object.freeableSizeBytes.low >>> 0, object.freeableSizeBytes.high >>> 0).toNumber();
                                if (object.exclusiveSizeBytes != null)
                                    if ($util.Long)
                                        (message.exclusiveSizeBytes = $util.Long.fromValue(object.exclusiveSizeBytes)).unsigned = false;
                                    else if (typeof object.exclusiveSizeBytes === "string")
                                        message.exclusiveSizeBytes = parseInt(object.exclusiveSizeBytes, 10);
                                    else if (typeof object.exclusiveSizeBytes === "number")
                                        message.exclusiveSizeBytes = object.exclusiveSizeBytes;
                                    else if (typeof object.exclusiveSizeBytes === "object")
                                        message.exclusiveSizeBytes = new $util.LongBits(object.exclusiveSizeBytes.low >>> 0, object.exclusiveSizeBytes.high >>> 0).toNumber();
                                switch (object.state) {
                                default:
                                    if (typeof object.state === "number") {
                                        message.state = object.state;
                                        break;
                                    }
                                    break;
                                case "STATE_UNSPECIFIED":
                                case 0:
                                    message.state = 0;
                                    break;
                                case "CREATING":
                                case 1:
                                    message.state = 1;
                                    break;
                                case "READY":
                                case 2:
                                    message.state = 2;
                                    break;
                                }
                                if (object.referencingDatabases) {
                                    if (!Array.isArray(object.referencingDatabases))
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.referencingDatabases: array expected");
                                    message.referencingDatabases = [];
                                    for (var i = 0; i < object.referencingDatabases.length; ++i)
                                        message.referencingDatabases[i] = String(object.referencingDatabases[i]);
                                }
                                if (object.encryptionInfo != null) {
                                    if (typeof object.encryptionInfo !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.encryptionInfo: object expected");
                                    message.encryptionInfo = $root.google.spanner.admin.database.v1.EncryptionInfo.fromObject(object.encryptionInfo);
                                }
                                if (object.encryptionInformation) {
                                    if (!Array.isArray(object.encryptionInformation))
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.encryptionInformation: array expected");
                                    message.encryptionInformation = [];
                                    for (var i = 0; i < object.encryptionInformation.length; ++i) {
                                        if (typeof object.encryptionInformation[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.Backup.encryptionInformation: object expected");
                                        message.encryptionInformation[i] = $root.google.spanner.admin.database.v1.EncryptionInfo.fromObject(object.encryptionInformation[i]);
                                    }
                                }
                                switch (object.databaseDialect) {
                                default:
                                    if (typeof object.databaseDialect === "number") {
                                        message.databaseDialect = object.databaseDialect;
                                        break;
                                    }
                                    break;
                                case "DATABASE_DIALECT_UNSPECIFIED":
                                case 0:
                                    message.databaseDialect = 0;
                                    break;
                                case "GOOGLE_STANDARD_SQL":
                                case 1:
                                    message.databaseDialect = 1;
                                    break;
                                case "POSTGRESQL":
                                case 2:
                                    message.databaseDialect = 2;
                                    break;
                                }
                                if (object.referencingBackups) {
                                    if (!Array.isArray(object.referencingBackups))
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.referencingBackups: array expected");
                                    message.referencingBackups = [];
                                    for (var i = 0; i < object.referencingBackups.length; ++i)
                                        message.referencingBackups[i] = String(object.referencingBackups[i]);
                                }
                                if (object.maxExpireTime != null) {
                                    if (typeof object.maxExpireTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.maxExpireTime: object expected");
                                    message.maxExpireTime = $root.google.protobuf.Timestamp.fromObject(object.maxExpireTime);
                                }
                                if (object.backupSchedules) {
                                    if (!Array.isArray(object.backupSchedules))
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.backupSchedules: array expected");
                                    message.backupSchedules = [];
                                    for (var i = 0; i < object.backupSchedules.length; ++i)
                                        message.backupSchedules[i] = String(object.backupSchedules[i]);
                                }
                                if (object.incrementalBackupChainId != null)
                                    message.incrementalBackupChainId = String(object.incrementalBackupChainId);
                                if (object.oldestVersionTime != null) {
                                    if (typeof object.oldestVersionTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.oldestVersionTime: object expected");
                                    message.oldestVersionTime = $root.google.protobuf.Timestamp.fromObject(object.oldestVersionTime);
                                }
                                if (object.instancePartitions) {
                                    if (!Array.isArray(object.instancePartitions))
                                        throw TypeError(".google.spanner.admin.database.v1.Backup.instancePartitions: array expected");
                                    message.instancePartitions = [];
                                    for (var i = 0; i < object.instancePartitions.length; ++i) {
                                        if (typeof object.instancePartitions[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.Backup.instancePartitions: object expected");
                                        message.instancePartitions[i] = $root.google.spanner.admin.database.v1.BackupInstancePartition.fromObject(object.instancePartitions[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Backup message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {google.spanner.admin.database.v1.Backup} message Backup
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Backup.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.referencingDatabases = [];
                                    object.referencingBackups = [];
                                    object.encryptionInformation = [];
                                    object.backupSchedules = [];
                                    object.instancePartitions = [];
                                }
                                if (options.defaults) {
                                    object.name = "";
                                    object.database = "";
                                    object.expireTime = null;
                                    object.createTime = null;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.sizeBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.sizeBytes = options.longs === String ? "0" : 0;
                                    object.state = options.enums === String ? "STATE_UNSPECIFIED" : 0;
                                    object.encryptionInfo = null;
                                    object.versionTime = null;
                                    object.databaseDialect = options.enums === String ? "DATABASE_DIALECT_UNSPECIFIED" : 0;
                                    object.maxExpireTime = null;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.freeableSizeBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.freeableSizeBytes = options.longs === String ? "0" : 0;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.exclusiveSizeBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.exclusiveSizeBytes = options.longs === String ? "0" : 0;
                                    object.incrementalBackupChainId = "";
                                    object.oldestVersionTime = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                    object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                                if (message.createTime != null && message.hasOwnProperty("createTime"))
                                    object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                                if (message.sizeBytes != null && message.hasOwnProperty("sizeBytes"))
                                    if (typeof message.sizeBytes === "number")
                                        object.sizeBytes = options.longs === String ? String(message.sizeBytes) : message.sizeBytes;
                                    else
                                        object.sizeBytes = options.longs === String ? $util.Long.prototype.toString.call(message.sizeBytes) : options.longs === Number ? new $util.LongBits(message.sizeBytes.low >>> 0, message.sizeBytes.high >>> 0).toNumber() : message.sizeBytes;
                                if (message.state != null && message.hasOwnProperty("state"))
                                    object.state = options.enums === String ? $root.google.spanner.admin.database.v1.Backup.State[message.state] === undefined ? message.state : $root.google.spanner.admin.database.v1.Backup.State[message.state] : message.state;
                                if (message.referencingDatabases && message.referencingDatabases.length) {
                                    object.referencingDatabases = [];
                                    for (var j = 0; j < message.referencingDatabases.length; ++j)
                                        object.referencingDatabases[j] = message.referencingDatabases[j];
                                }
                                if (message.encryptionInfo != null && message.hasOwnProperty("encryptionInfo"))
                                    object.encryptionInfo = $root.google.spanner.admin.database.v1.EncryptionInfo.toObject(message.encryptionInfo, options);
                                if (message.versionTime != null && message.hasOwnProperty("versionTime"))
                                    object.versionTime = $root.google.protobuf.Timestamp.toObject(message.versionTime, options);
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    object.databaseDialect = options.enums === String ? $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] === undefined ? message.databaseDialect : $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] : message.databaseDialect;
                                if (message.referencingBackups && message.referencingBackups.length) {
                                    object.referencingBackups = [];
                                    for (var j = 0; j < message.referencingBackups.length; ++j)
                                        object.referencingBackups[j] = message.referencingBackups[j];
                                }
                                if (message.maxExpireTime != null && message.hasOwnProperty("maxExpireTime"))
                                    object.maxExpireTime = $root.google.protobuf.Timestamp.toObject(message.maxExpireTime, options);
                                if (message.encryptionInformation && message.encryptionInformation.length) {
                                    object.encryptionInformation = [];
                                    for (var j = 0; j < message.encryptionInformation.length; ++j)
                                        object.encryptionInformation[j] = $root.google.spanner.admin.database.v1.EncryptionInfo.toObject(message.encryptionInformation[j], options);
                                }
                                if (message.backupSchedules && message.backupSchedules.length) {
                                    object.backupSchedules = [];
                                    for (var j = 0; j < message.backupSchedules.length; ++j)
                                        object.backupSchedules[j] = message.backupSchedules[j];
                                }
                                if (message.freeableSizeBytes != null && message.hasOwnProperty("freeableSizeBytes"))
                                    if (typeof message.freeableSizeBytes === "number")
                                        object.freeableSizeBytes = options.longs === String ? String(message.freeableSizeBytes) : message.freeableSizeBytes;
                                    else
                                        object.freeableSizeBytes = options.longs === String ? $util.Long.prototype.toString.call(message.freeableSizeBytes) : options.longs === Number ? new $util.LongBits(message.freeableSizeBytes.low >>> 0, message.freeableSizeBytes.high >>> 0).toNumber() : message.freeableSizeBytes;
                                if (message.exclusiveSizeBytes != null && message.hasOwnProperty("exclusiveSizeBytes"))
                                    if (typeof message.exclusiveSizeBytes === "number")
                                        object.exclusiveSizeBytes = options.longs === String ? String(message.exclusiveSizeBytes) : message.exclusiveSizeBytes;
                                    else
                                        object.exclusiveSizeBytes = options.longs === String ? $util.Long.prototype.toString.call(message.exclusiveSizeBytes) : options.longs === Number ? new $util.LongBits(message.exclusiveSizeBytes.low >>> 0, message.exclusiveSizeBytes.high >>> 0).toNumber() : message.exclusiveSizeBytes;
                                if (message.incrementalBackupChainId != null && message.hasOwnProperty("incrementalBackupChainId"))
                                    object.incrementalBackupChainId = message.incrementalBackupChainId;
                                if (message.oldestVersionTime != null && message.hasOwnProperty("oldestVersionTime"))
                                    object.oldestVersionTime = $root.google.protobuf.Timestamp.toObject(message.oldestVersionTime, options);
                                if (message.instancePartitions && message.instancePartitions.length) {
                                    object.instancePartitions = [];
                                    for (var j = 0; j < message.instancePartitions.length; ++j)
                                        object.instancePartitions[j] = $root.google.spanner.admin.database.v1.BackupInstancePartition.toObject(message.instancePartitions[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this Backup to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Backup.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Backup
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.Backup
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Backup.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.Backup";
                            };
    
                            /**
                             * State enum.
                             * @name google.spanner.admin.database.v1.Backup.State
                             * @enum {number}
                             * @property {number} STATE_UNSPECIFIED=0 STATE_UNSPECIFIED value
                             * @property {number} CREATING=1 CREATING value
                             * @property {number} READY=2 READY value
                             */
                            Backup.State = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "STATE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "CREATING"] = 1;
                                values[valuesById[2] = "READY"] = 2;
                                return values;
                            })();
    
                            return Backup;
                        })();
    
                        v1.CreateBackupRequest = (function() {
    
                            /**
                             * Properties of a CreateBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateBackupRequest
                             * @property {string|null} [parent] CreateBackupRequest parent
                             * @property {string|null} [backupId] CreateBackupRequest backupId
                             * @property {google.spanner.admin.database.v1.IBackup|null} [backup] CreateBackupRequest backup
                             * @property {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig|null} [encryptionConfig] CreateBackupRequest encryptionConfig
                             */
    
                            /**
                             * Constructs a new CreateBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateBackupRequest.
                             * @implements ICreateBackupRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest=} [properties] Properties to set
                             */
                            function CreateBackupRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateBackupRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @instance
                             */
                            CreateBackupRequest.prototype.parent = "";
    
                            /**
                             * CreateBackupRequest backupId.
                             * @member {string} backupId
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @instance
                             */
                            CreateBackupRequest.prototype.backupId = "";
    
                            /**
                             * CreateBackupRequest backup.
                             * @member {google.spanner.admin.database.v1.IBackup|null|undefined} backup
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @instance
                             */
                            CreateBackupRequest.prototype.backup = null;
    
                            /**
                             * CreateBackupRequest encryptionConfig.
                             * @member {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @instance
                             */
                            CreateBackupRequest.prototype.encryptionConfig = null;
    
                            /**
                             * Creates a new CreateBackupRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateBackupRequest} CreateBackupRequest instance
                             */
                            CreateBackupRequest.create = function create(properties) {
                                return new CreateBackupRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateBackupRequest message. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest} message CreateBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.backupId);
                                if (message.backup != null && Object.hasOwnProperty.call(message, "backup"))
                                    $root.google.spanner.admin.database.v1.Backup.encode(message.backup, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateBackupRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest} message CreateBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateBackupRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateBackupRequest} CreateBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateBackupRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.backupId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.backup = $root.google.spanner.admin.database.v1.Backup.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateBackupRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateBackupRequest} CreateBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateBackupRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateBackupRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.backupId != null && message.hasOwnProperty("backupId"))
                                    if (!$util.isString(message.backupId))
                                        return "backupId: string expected";
                                if (message.backup != null && message.hasOwnProperty("backup")) {
                                    var error = $root.google.spanner.admin.database.v1.Backup.verify(message.backup);
                                    if (error)
                                        return "backup." + error;
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateBackupRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateBackupRequest} CreateBackupRequest
                             */
                            CreateBackupRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateBackupRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateBackupRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.backupId != null)
                                    message.backupId = String(object.backupId);
                                if (object.backup != null) {
                                    if (typeof object.backup !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupRequest.backup: object expected");
                                    message.backup = $root.google.spanner.admin.database.v1.Backup.fromObject(object.backup);
                                }
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupRequest.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateBackupRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateBackupRequest} message CreateBackupRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateBackupRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.backupId = "";
                                    object.backup = null;
                                    object.encryptionConfig = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.backupId != null && message.hasOwnProperty("backupId"))
                                    object.backupId = message.backupId;
                                if (message.backup != null && message.hasOwnProperty("backup"))
                                    object.backup = $root.google.spanner.admin.database.v1.Backup.toObject(message.backup, options);
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.toObject(message.encryptionConfig, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateBackupRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateBackupRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateBackupRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateBackupRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateBackupRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateBackupRequest";
                            };
    
                            return CreateBackupRequest;
                        })();
    
                        v1.CreateBackupMetadata = (function() {
    
                            /**
                             * Properties of a CreateBackupMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateBackupMetadata
                             * @property {string|null} [name] CreateBackupMetadata name
                             * @property {string|null} [database] CreateBackupMetadata database
                             * @property {google.spanner.admin.database.v1.IOperationProgress|null} [progress] CreateBackupMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] CreateBackupMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new CreateBackupMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateBackupMetadata.
                             * @implements ICreateBackupMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateBackupMetadata=} [properties] Properties to set
                             */
                            function CreateBackupMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateBackupMetadata name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @instance
                             */
                            CreateBackupMetadata.prototype.name = "";
    
                            /**
                             * CreateBackupMetadata database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @instance
                             */
                            CreateBackupMetadata.prototype.database = "";
    
                            /**
                             * CreateBackupMetadata progress.
                             * @member {google.spanner.admin.database.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @instance
                             */
                            CreateBackupMetadata.prototype.progress = null;
    
                            /**
                             * CreateBackupMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @instance
                             */
                            CreateBackupMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new CreateBackupMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateBackupMetadata} CreateBackupMetadata instance
                             */
                            CreateBackupMetadata.create = function create(properties) {
                                return new CreateBackupMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CreateBackupMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupMetadata} message CreateBackupMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.database);
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateBackupMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupMetadata} message CreateBackupMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateBackupMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateBackupMetadata} CreateBackupMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateBackupMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.progress = $root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateBackupMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateBackupMetadata} CreateBackupMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateBackupMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateBackupMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateBackupMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateBackupMetadata} CreateBackupMetadata
                             */
                            CreateBackupMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateBackupMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateBackupMetadata();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateBackupMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateBackupMetadata} message CreateBackupMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateBackupMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.database = "";
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateBackupMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateBackupMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateBackupMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateBackupMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateBackupMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateBackupMetadata";
                            };
    
                            return CreateBackupMetadata;
                        })();
    
                        v1.CopyBackupRequest = (function() {
    
                            /**
                             * Properties of a CopyBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICopyBackupRequest
                             * @property {string|null} [parent] CopyBackupRequest parent
                             * @property {string|null} [backupId] CopyBackupRequest backupId
                             * @property {string|null} [sourceBackup] CopyBackupRequest sourceBackup
                             * @property {google.protobuf.ITimestamp|null} [expireTime] CopyBackupRequest expireTime
                             * @property {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig|null} [encryptionConfig] CopyBackupRequest encryptionConfig
                             */
    
                            /**
                             * Constructs a new CopyBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CopyBackupRequest.
                             * @implements ICopyBackupRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest=} [properties] Properties to set
                             */
                            function CopyBackupRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CopyBackupRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             */
                            CopyBackupRequest.prototype.parent = "";
    
                            /**
                             * CopyBackupRequest backupId.
                             * @member {string} backupId
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             */
                            CopyBackupRequest.prototype.backupId = "";
    
                            /**
                             * CopyBackupRequest sourceBackup.
                             * @member {string} sourceBackup
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             */
                            CopyBackupRequest.prototype.sourceBackup = "";
    
                            /**
                             * CopyBackupRequest expireTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             */
                            CopyBackupRequest.prototype.expireTime = null;
    
                            /**
                             * CopyBackupRequest encryptionConfig.
                             * @member {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             */
                            CopyBackupRequest.prototype.encryptionConfig = null;
    
                            /**
                             * Creates a new CopyBackupRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CopyBackupRequest} CopyBackupRequest instance
                             */
                            CopyBackupRequest.create = function create(properties) {
                                return new CopyBackupRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CopyBackupRequest message. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest} message CopyBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.backupId);
                                if (message.sourceBackup != null && Object.hasOwnProperty.call(message, "sourceBackup"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.sourceBackup);
                                if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                    $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CopyBackupRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest} message CopyBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CopyBackupRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CopyBackupRequest} CopyBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CopyBackupRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.backupId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.sourceBackup = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CopyBackupRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CopyBackupRequest} CopyBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CopyBackupRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CopyBackupRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.backupId != null && message.hasOwnProperty("backupId"))
                                    if (!$util.isString(message.backupId))
                                        return "backupId: string expected";
                                if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                    if (!$util.isString(message.sourceBackup))
                                        return "sourceBackup: string expected";
                                if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                    if (error)
                                        return "expireTime." + error;
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CopyBackupRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CopyBackupRequest} CopyBackupRequest
                             */
                            CopyBackupRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CopyBackupRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CopyBackupRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.backupId != null)
                                    message.backupId = String(object.backupId);
                                if (object.sourceBackup != null)
                                    message.sourceBackup = String(object.sourceBackup);
                                if (object.expireTime != null) {
                                    if (typeof object.expireTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CopyBackupRequest.expireTime: object expected");
                                    message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                                }
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CopyBackupRequest.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CopyBackupRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.CopyBackupRequest} message CopyBackupRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CopyBackupRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.backupId = "";
                                    object.sourceBackup = "";
                                    object.expireTime = null;
                                    object.encryptionConfig = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.backupId != null && message.hasOwnProperty("backupId"))
                                    object.backupId = message.backupId;
                                if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                    object.sourceBackup = message.sourceBackup;
                                if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                    object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.toObject(message.encryptionConfig, options);
                                return object;
                            };
    
                            /**
                             * Converts this CopyBackupRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CopyBackupRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CopyBackupRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CopyBackupRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CopyBackupRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CopyBackupRequest";
                            };
    
                            return CopyBackupRequest;
                        })();
    
                        v1.CopyBackupMetadata = (function() {
    
                            /**
                             * Properties of a CopyBackupMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICopyBackupMetadata
                             * @property {string|null} [name] CopyBackupMetadata name
                             * @property {string|null} [sourceBackup] CopyBackupMetadata sourceBackup
                             * @property {google.spanner.admin.database.v1.IOperationProgress|null} [progress] CopyBackupMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] CopyBackupMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new CopyBackupMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CopyBackupMetadata.
                             * @implements ICopyBackupMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICopyBackupMetadata=} [properties] Properties to set
                             */
                            function CopyBackupMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CopyBackupMetadata name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @instance
                             */
                            CopyBackupMetadata.prototype.name = "";
    
                            /**
                             * CopyBackupMetadata sourceBackup.
                             * @member {string} sourceBackup
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @instance
                             */
                            CopyBackupMetadata.prototype.sourceBackup = "";
    
                            /**
                             * CopyBackupMetadata progress.
                             * @member {google.spanner.admin.database.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @instance
                             */
                            CopyBackupMetadata.prototype.progress = null;
    
                            /**
                             * CopyBackupMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @instance
                             */
                            CopyBackupMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new CopyBackupMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CopyBackupMetadata} CopyBackupMetadata instance
                             */
                            CopyBackupMetadata.create = function create(properties) {
                                return new CopyBackupMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CopyBackupMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupMetadata} message CopyBackupMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.sourceBackup != null && Object.hasOwnProperty.call(message, "sourceBackup"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.sourceBackup);
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CopyBackupMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupMetadata} message CopyBackupMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CopyBackupMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CopyBackupMetadata} CopyBackupMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CopyBackupMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.sourceBackup = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.progress = $root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CopyBackupMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CopyBackupMetadata} CopyBackupMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CopyBackupMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CopyBackupMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                    if (!$util.isString(message.sourceBackup))
                                        return "sourceBackup: string expected";
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CopyBackupMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CopyBackupMetadata} CopyBackupMetadata
                             */
                            CopyBackupMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CopyBackupMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CopyBackupMetadata();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.sourceBackup != null)
                                    message.sourceBackup = String(object.sourceBackup);
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CopyBackupMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CopyBackupMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CopyBackupMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.CopyBackupMetadata} message CopyBackupMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CopyBackupMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.sourceBackup = "";
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                    object.sourceBackup = message.sourceBackup;
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this CopyBackupMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CopyBackupMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CopyBackupMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CopyBackupMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CopyBackupMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CopyBackupMetadata";
                            };
    
                            return CopyBackupMetadata;
                        })();
    
                        v1.UpdateBackupRequest = (function() {
    
                            /**
                             * Properties of an UpdateBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateBackupRequest
                             * @property {google.spanner.admin.database.v1.IBackup|null} [backup] UpdateBackupRequest backup
                             * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateBackupRequest updateMask
                             */
    
                            /**
                             * Constructs a new UpdateBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateBackupRequest.
                             * @implements IUpdateBackupRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest=} [properties] Properties to set
                             */
                            function UpdateBackupRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateBackupRequest backup.
                             * @member {google.spanner.admin.database.v1.IBackup|null|undefined} backup
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @instance
                             */
                            UpdateBackupRequest.prototype.backup = null;
    
                            /**
                             * UpdateBackupRequest updateMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @instance
                             */
                            UpdateBackupRequest.prototype.updateMask = null;
    
                            /**
                             * Creates a new UpdateBackupRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateBackupRequest} UpdateBackupRequest instance
                             */
                            UpdateBackupRequest.create = function create(properties) {
                                return new UpdateBackupRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateBackupRequest message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateBackupRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest} message UpdateBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateBackupRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.backup != null && Object.hasOwnProperty.call(message, "backup"))
                                    $root.google.spanner.admin.database.v1.Backup.encode(message.backup, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                                    $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateBackupRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateBackupRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest} message UpdateBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateBackupRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateBackupRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateBackupRequest} UpdateBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateBackupRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateBackupRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.backup = $root.google.spanner.admin.database.v1.Backup.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateBackupRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateBackupRequest} UpdateBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateBackupRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateBackupRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateBackupRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.backup != null && message.hasOwnProperty("backup")) {
                                    var error = $root.google.spanner.admin.database.v1.Backup.verify(message.backup);
                                    if (error)
                                        return "backup." + error;
                                }
                                if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                                    if (error)
                                        return "updateMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateBackupRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateBackupRequest} UpdateBackupRequest
                             */
                            UpdateBackupRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateBackupRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateBackupRequest();
                                if (object.backup != null) {
                                    if (typeof object.backup !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateBackupRequest.backup: object expected");
                                    message.backup = $root.google.spanner.admin.database.v1.Backup.fromObject(object.backup);
                                }
                                if (object.updateMask != null) {
                                    if (typeof object.updateMask !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateBackupRequest.updateMask: object expected");
                                    message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateBackupRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateBackupRequest} message UpdateBackupRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateBackupRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.backup = null;
                                    object.updateMask = null;
                                }
                                if (message.backup != null && message.hasOwnProperty("backup"))
                                    object.backup = $root.google.spanner.admin.database.v1.Backup.toObject(message.backup, options);
                                if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                                    object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateBackupRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateBackupRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateBackupRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateBackupRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateBackupRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateBackupRequest";
                            };
    
                            return UpdateBackupRequest;
                        })();
    
                        v1.GetBackupRequest = (function() {
    
                            /**
                             * Properties of a GetBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IGetBackupRequest
                             * @property {string|null} [name] GetBackupRequest name
                             */
    
                            /**
                             * Constructs a new GetBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a GetBackupRequest.
                             * @implements IGetBackupRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest=} [properties] Properties to set
                             */
                            function GetBackupRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetBackupRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @instance
                             */
                            GetBackupRequest.prototype.name = "";
    
                            /**
                             * Creates a new GetBackupRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.GetBackupRequest} GetBackupRequest instance
                             */
                            GetBackupRequest.create = function create(properties) {
                                return new GetBackupRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetBackupRequest message. Does not implicitly {@link google.spanner.admin.database.v1.GetBackupRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest} message GetBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetBackupRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetBackupRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.GetBackupRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest} message GetBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetBackupRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetBackupRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.GetBackupRequest} GetBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetBackupRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.GetBackupRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetBackupRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.GetBackupRequest} GetBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetBackupRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetBackupRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetBackupRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetBackupRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.GetBackupRequest} GetBackupRequest
                             */
                            GetBackupRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.GetBackupRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.GetBackupRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetBackupRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.GetBackupRequest} message GetBackupRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetBackupRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this GetBackupRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetBackupRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetBackupRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.GetBackupRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetBackupRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.GetBackupRequest";
                            };
    
                            return GetBackupRequest;
                        })();
    
                        v1.DeleteBackupRequest = (function() {
    
                            /**
                             * Properties of a DeleteBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDeleteBackupRequest
                             * @property {string|null} [name] DeleteBackupRequest name
                             */
    
                            /**
                             * Constructs a new DeleteBackupRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DeleteBackupRequest.
                             * @implements IDeleteBackupRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest=} [properties] Properties to set
                             */
                            function DeleteBackupRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DeleteBackupRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @instance
                             */
                            DeleteBackupRequest.prototype.name = "";
    
                            /**
                             * Creates a new DeleteBackupRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.DeleteBackupRequest} DeleteBackupRequest instance
                             */
                            DeleteBackupRequest.create = function create(properties) {
                                return new DeleteBackupRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DeleteBackupRequest message. Does not implicitly {@link google.spanner.admin.database.v1.DeleteBackupRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest} message DeleteBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteBackupRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DeleteBackupRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.DeleteBackupRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest} message DeleteBackupRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteBackupRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DeleteBackupRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.DeleteBackupRequest} DeleteBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteBackupRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.DeleteBackupRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DeleteBackupRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.DeleteBackupRequest} DeleteBackupRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteBackupRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DeleteBackupRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DeleteBackupRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DeleteBackupRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.DeleteBackupRequest} DeleteBackupRequest
                             */
                            DeleteBackupRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.DeleteBackupRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.DeleteBackupRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DeleteBackupRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.DeleteBackupRequest} message DeleteBackupRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DeleteBackupRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this DeleteBackupRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DeleteBackupRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DeleteBackupRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.DeleteBackupRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DeleteBackupRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.DeleteBackupRequest";
                            };
    
                            return DeleteBackupRequest;
                        })();
    
                        v1.ListBackupsRequest = (function() {
    
                            /**
                             * Properties of a ListBackupsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupsRequest
                             * @property {string|null} [parent] ListBackupsRequest parent
                             * @property {string|null} [filter] ListBackupsRequest filter
                             * @property {number|null} [pageSize] ListBackupsRequest pageSize
                             * @property {string|null} [pageToken] ListBackupsRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListBackupsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupsRequest.
                             * @implements IListBackupsRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest=} [properties] Properties to set
                             */
                            function ListBackupsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @instance
                             */
                            ListBackupsRequest.prototype.parent = "";
    
                            /**
                             * ListBackupsRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @instance
                             */
                            ListBackupsRequest.prototype.filter = "";
    
                            /**
                             * ListBackupsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @instance
                             */
                            ListBackupsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListBackupsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @instance
                             */
                            ListBackupsRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListBackupsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupsRequest} ListBackupsRequest instance
                             */
                            ListBackupsRequest.create = function create(properties) {
                                return new ListBackupsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupsRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest} message ListBackupsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest} message ListBackupsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupsRequest} ListBackupsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupsRequest} ListBackupsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupsRequest} ListBackupsRequest
                             */
                            ListBackupsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupsRequest} message ListBackupsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.filter = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupsRequest";
                            };
    
                            return ListBackupsRequest;
                        })();
    
                        v1.ListBackupsResponse = (function() {
    
                            /**
                             * Properties of a ListBackupsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupsResponse
                             * @property {Array.<google.spanner.admin.database.v1.IBackup>|null} [backups] ListBackupsResponse backups
                             * @property {string|null} [nextPageToken] ListBackupsResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListBackupsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupsResponse.
                             * @implements IListBackupsResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupsResponse=} [properties] Properties to set
                             */
                            function ListBackupsResponse(properties) {
                                this.backups = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupsResponse backups.
                             * @member {Array.<google.spanner.admin.database.v1.IBackup>} backups
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @instance
                             */
                            ListBackupsResponse.prototype.backups = $util.emptyArray;
    
                            /**
                             * ListBackupsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @instance
                             */
                            ListBackupsResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListBackupsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupsResponse} ListBackupsResponse instance
                             */
                            ListBackupsResponse.create = function create(properties) {
                                return new ListBackupsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupsResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsResponse} message ListBackupsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.backups != null && message.backups.length)
                                    for (var i = 0; i < message.backups.length; ++i)
                                        $root.google.spanner.admin.database.v1.Backup.encode(message.backups[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupsResponse} message ListBackupsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupsResponse} ListBackupsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.backups && message.backups.length))
                                                message.backups = [];
                                            message.backups.push($root.google.spanner.admin.database.v1.Backup.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupsResponse} ListBackupsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.backups != null && message.hasOwnProperty("backups")) {
                                    if (!Array.isArray(message.backups))
                                        return "backups: array expected";
                                    for (var i = 0; i < message.backups.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.Backup.verify(message.backups[i]);
                                        if (error)
                                            return "backups." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupsResponse} ListBackupsResponse
                             */
                            ListBackupsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupsResponse();
                                if (object.backups) {
                                    if (!Array.isArray(object.backups))
                                        throw TypeError(".google.spanner.admin.database.v1.ListBackupsResponse.backups: array expected");
                                    message.backups = [];
                                    for (var i = 0; i < object.backups.length; ++i) {
                                        if (typeof object.backups[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListBackupsResponse.backups: object expected");
                                        message.backups[i] = $root.google.spanner.admin.database.v1.Backup.fromObject(object.backups[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupsResponse} message ListBackupsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.backups = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.backups && message.backups.length) {
                                    object.backups = [];
                                    for (var j = 0; j < message.backups.length; ++j)
                                        object.backups[j] = $root.google.spanner.admin.database.v1.Backup.toObject(message.backups[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupsResponse";
                            };
    
                            return ListBackupsResponse;
                        })();
    
                        v1.ListBackupOperationsRequest = (function() {
    
                            /**
                             * Properties of a ListBackupOperationsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupOperationsRequest
                             * @property {string|null} [parent] ListBackupOperationsRequest parent
                             * @property {string|null} [filter] ListBackupOperationsRequest filter
                             * @property {number|null} [pageSize] ListBackupOperationsRequest pageSize
                             * @property {string|null} [pageToken] ListBackupOperationsRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListBackupOperationsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupOperationsRequest.
                             * @implements IListBackupOperationsRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest=} [properties] Properties to set
                             */
                            function ListBackupOperationsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupOperationsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @instance
                             */
                            ListBackupOperationsRequest.prototype.parent = "";
    
                            /**
                             * ListBackupOperationsRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @instance
                             */
                            ListBackupOperationsRequest.prototype.filter = "";
    
                            /**
                             * ListBackupOperationsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @instance
                             */
                            ListBackupOperationsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListBackupOperationsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @instance
                             */
                            ListBackupOperationsRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListBackupOperationsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsRequest} ListBackupOperationsRequest instance
                             */
                            ListBackupOperationsRequest.create = function create(properties) {
                                return new ListBackupOperationsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupOperationsRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupOperationsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest} message ListBackupOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupOperationsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupOperationsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupOperationsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest} message ListBackupOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupOperationsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsRequest} ListBackupOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupOperationsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupOperationsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupOperationsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsRequest} ListBackupOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupOperationsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupOperationsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupOperationsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsRequest} ListBackupOperationsRequest
                             */
                            ListBackupOperationsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupOperationsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupOperationsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupOperationsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupOperationsRequest} message ListBackupOperationsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupOperationsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.filter = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupOperationsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupOperationsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupOperationsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupOperationsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupOperationsRequest";
                            };
    
                            return ListBackupOperationsRequest;
                        })();
    
                        v1.ListBackupOperationsResponse = (function() {
    
                            /**
                             * Properties of a ListBackupOperationsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupOperationsResponse
                             * @property {Array.<google.longrunning.IOperation>|null} [operations] ListBackupOperationsResponse operations
                             * @property {string|null} [nextPageToken] ListBackupOperationsResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListBackupOperationsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupOperationsResponse.
                             * @implements IListBackupOperationsResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsResponse=} [properties] Properties to set
                             */
                            function ListBackupOperationsResponse(properties) {
                                this.operations = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupOperationsResponse operations.
                             * @member {Array.<google.longrunning.IOperation>} operations
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @instance
                             */
                            ListBackupOperationsResponse.prototype.operations = $util.emptyArray;
    
                            /**
                             * ListBackupOperationsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @instance
                             */
                            ListBackupOperationsResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListBackupOperationsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsResponse} ListBackupOperationsResponse instance
                             */
                            ListBackupOperationsResponse.create = function create(properties) {
                                return new ListBackupOperationsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupOperationsResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupOperationsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsResponse} message ListBackupOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupOperationsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.operations != null && message.operations.length)
                                    for (var i = 0; i < message.operations.length; ++i)
                                        $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupOperationsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupOperationsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsResponse} message ListBackupOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupOperationsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsResponse} ListBackupOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupOperationsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupOperationsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.operations && message.operations.length))
                                                message.operations = [];
                                            message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupOperationsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsResponse} ListBackupOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupOperationsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupOperationsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.operations != null && message.hasOwnProperty("operations")) {
                                    if (!Array.isArray(message.operations))
                                        return "operations: array expected";
                                    for (var i = 0; i < message.operations.length; ++i) {
                                        var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                                        if (error)
                                            return "operations." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupOperationsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupOperationsResponse} ListBackupOperationsResponse
                             */
                            ListBackupOperationsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupOperationsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupOperationsResponse();
                                if (object.operations) {
                                    if (!Array.isArray(object.operations))
                                        throw TypeError(".google.spanner.admin.database.v1.ListBackupOperationsResponse.operations: array expected");
                                    message.operations = [];
                                    for (var i = 0; i < object.operations.length; ++i) {
                                        if (typeof object.operations[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListBackupOperationsResponse.operations: object expected");
                                        message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupOperationsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupOperationsResponse} message ListBackupOperationsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupOperationsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.operations = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.operations && message.operations.length) {
                                    object.operations = [];
                                    for (var j = 0; j < message.operations.length; ++j)
                                        object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupOperationsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupOperationsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupOperationsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupOperationsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupOperationsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupOperationsResponse";
                            };
    
                            return ListBackupOperationsResponse;
                        })();
    
                        v1.BackupInfo = (function() {
    
                            /**
                             * Properties of a BackupInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IBackupInfo
                             * @property {string|null} [backup] BackupInfo backup
                             * @property {google.protobuf.ITimestamp|null} [versionTime] BackupInfo versionTime
                             * @property {google.protobuf.ITimestamp|null} [createTime] BackupInfo createTime
                             * @property {string|null} [sourceDatabase] BackupInfo sourceDatabase
                             */
    
                            /**
                             * Constructs a new BackupInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a BackupInfo.
                             * @implements IBackupInfo
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IBackupInfo=} [properties] Properties to set
                             */
                            function BackupInfo(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * BackupInfo backup.
                             * @member {string} backup
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @instance
                             */
                            BackupInfo.prototype.backup = "";
    
                            /**
                             * BackupInfo versionTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} versionTime
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @instance
                             */
                            BackupInfo.prototype.versionTime = null;
    
                            /**
                             * BackupInfo createTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} createTime
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @instance
                             */
                            BackupInfo.prototype.createTime = null;
    
                            /**
                             * BackupInfo sourceDatabase.
                             * @member {string} sourceDatabase
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @instance
                             */
                            BackupInfo.prototype.sourceDatabase = "";
    
                            /**
                             * Creates a new BackupInfo instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInfo=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.BackupInfo} BackupInfo instance
                             */
                            BackupInfo.create = function create(properties) {
                                return new BackupInfo(properties);
                            };
    
                            /**
                             * Encodes the specified BackupInfo message. Does not implicitly {@link google.spanner.admin.database.v1.BackupInfo.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInfo} message BackupInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupInfo.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.backup != null && Object.hasOwnProperty.call(message, "backup"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.backup);
                                if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                                    $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.sourceDatabase != null && Object.hasOwnProperty.call(message, "sourceDatabase"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.sourceDatabase);
                                if (message.versionTime != null && Object.hasOwnProperty.call(message, "versionTime"))
                                    $root.google.protobuf.Timestamp.encode(message.versionTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified BackupInfo message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.BackupInfo.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInfo} message BackupInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupInfo.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a BackupInfo message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.BackupInfo} BackupInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupInfo.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.BackupInfo();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.backup = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.versionTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.sourceDatabase = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a BackupInfo message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.BackupInfo} BackupInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupInfo.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a BackupInfo message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            BackupInfo.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.backup != null && message.hasOwnProperty("backup"))
                                    if (!$util.isString(message.backup))
                                        return "backup: string expected";
                                if (message.versionTime != null && message.hasOwnProperty("versionTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.versionTime);
                                    if (error)
                                        return "versionTime." + error;
                                }
                                if (message.createTime != null && message.hasOwnProperty("createTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                                    if (error)
                                        return "createTime." + error;
                                }
                                if (message.sourceDatabase != null && message.hasOwnProperty("sourceDatabase"))
                                    if (!$util.isString(message.sourceDatabase))
                                        return "sourceDatabase: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a BackupInfo message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.BackupInfo} BackupInfo
                             */
                            BackupInfo.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.BackupInfo)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.BackupInfo();
                                if (object.backup != null)
                                    message.backup = String(object.backup);
                                if (object.versionTime != null) {
                                    if (typeof object.versionTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupInfo.versionTime: object expected");
                                    message.versionTime = $root.google.protobuf.Timestamp.fromObject(object.versionTime);
                                }
                                if (object.createTime != null) {
                                    if (typeof object.createTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupInfo.createTime: object expected");
                                    message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                                }
                                if (object.sourceDatabase != null)
                                    message.sourceDatabase = String(object.sourceDatabase);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a BackupInfo message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.BackupInfo} message BackupInfo
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            BackupInfo.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.backup = "";
                                    object.createTime = null;
                                    object.sourceDatabase = "";
                                    object.versionTime = null;
                                }
                                if (message.backup != null && message.hasOwnProperty("backup"))
                                    object.backup = message.backup;
                                if (message.createTime != null && message.hasOwnProperty("createTime"))
                                    object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                                if (message.sourceDatabase != null && message.hasOwnProperty("sourceDatabase"))
                                    object.sourceDatabase = message.sourceDatabase;
                                if (message.versionTime != null && message.hasOwnProperty("versionTime"))
                                    object.versionTime = $root.google.protobuf.Timestamp.toObject(message.versionTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this BackupInfo to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            BackupInfo.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for BackupInfo
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.BackupInfo
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            BackupInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.BackupInfo";
                            };
    
                            return BackupInfo;
                        })();
    
                        v1.CreateBackupEncryptionConfig = (function() {
    
                            /**
                             * Properties of a CreateBackupEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateBackupEncryptionConfig
                             * @property {google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType|null} [encryptionType] CreateBackupEncryptionConfig encryptionType
                             * @property {string|null} [kmsKeyName] CreateBackupEncryptionConfig kmsKeyName
                             * @property {Array.<string>|null} [kmsKeyNames] CreateBackupEncryptionConfig kmsKeyNames
                             */
    
                            /**
                             * Constructs a new CreateBackupEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateBackupEncryptionConfig.
                             * @implements ICreateBackupEncryptionConfig
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig=} [properties] Properties to set
                             */
                            function CreateBackupEncryptionConfig(properties) {
                                this.kmsKeyNames = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateBackupEncryptionConfig encryptionType.
                             * @member {google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType} encryptionType
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @instance
                             */
                            CreateBackupEncryptionConfig.prototype.encryptionType = 0;
    
                            /**
                             * CreateBackupEncryptionConfig kmsKeyName.
                             * @member {string} kmsKeyName
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @instance
                             */
                            CreateBackupEncryptionConfig.prototype.kmsKeyName = "";
    
                            /**
                             * CreateBackupEncryptionConfig kmsKeyNames.
                             * @member {Array.<string>} kmsKeyNames
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @instance
                             */
                            CreateBackupEncryptionConfig.prototype.kmsKeyNames = $util.emptyArray;
    
                            /**
                             * Creates a new CreateBackupEncryptionConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateBackupEncryptionConfig} CreateBackupEncryptionConfig instance
                             */
                            CreateBackupEncryptionConfig.create = function create(properties) {
                                return new CreateBackupEncryptionConfig(properties);
                            };
    
                            /**
                             * Encodes the specified CreateBackupEncryptionConfig message. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupEncryptionConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig} message CreateBackupEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupEncryptionConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.encryptionType != null && Object.hasOwnProperty.call(message, "encryptionType"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.encryptionType);
                                if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                                if (message.kmsKeyNames != null && message.kmsKeyNames.length)
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.kmsKeyNames[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateBackupEncryptionConfig message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupEncryptionConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig} message CreateBackupEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupEncryptionConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateBackupEncryptionConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateBackupEncryptionConfig} CreateBackupEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupEncryptionConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.encryptionType = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.kmsKeyName = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.kmsKeyNames && message.kmsKeyNames.length))
                                                message.kmsKeyNames = [];
                                            message.kmsKeyNames.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateBackupEncryptionConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateBackupEncryptionConfig} CreateBackupEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupEncryptionConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateBackupEncryptionConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateBackupEncryptionConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    switch (message.encryptionType) {
                                    default:
                                        return "encryptionType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    if (!$util.isString(message.kmsKeyName))
                                        return "kmsKeyName: string expected";
                                if (message.kmsKeyNames != null && message.hasOwnProperty("kmsKeyNames")) {
                                    if (!Array.isArray(message.kmsKeyNames))
                                        return "kmsKeyNames: array expected";
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        if (!$util.isString(message.kmsKeyNames[i]))
                                            return "kmsKeyNames: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateBackupEncryptionConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateBackupEncryptionConfig} CreateBackupEncryptionConfig
                             */
                            CreateBackupEncryptionConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig();
                                switch (object.encryptionType) {
                                default:
                                    if (typeof object.encryptionType === "number") {
                                        message.encryptionType = object.encryptionType;
                                        break;
                                    }
                                    break;
                                case "ENCRYPTION_TYPE_UNSPECIFIED":
                                case 0:
                                    message.encryptionType = 0;
                                    break;
                                case "USE_DATABASE_ENCRYPTION":
                                case 1:
                                    message.encryptionType = 1;
                                    break;
                                case "GOOGLE_DEFAULT_ENCRYPTION":
                                case 2:
                                    message.encryptionType = 2;
                                    break;
                                case "CUSTOMER_MANAGED_ENCRYPTION":
                                case 3:
                                    message.encryptionType = 3;
                                    break;
                                }
                                if (object.kmsKeyName != null)
                                    message.kmsKeyName = String(object.kmsKeyName);
                                if (object.kmsKeyNames) {
                                    if (!Array.isArray(object.kmsKeyNames))
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupEncryptionConfig.kmsKeyNames: array expected");
                                    message.kmsKeyNames = [];
                                    for (var i = 0; i < object.kmsKeyNames.length; ++i)
                                        message.kmsKeyNames[i] = String(object.kmsKeyNames[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateBackupEncryptionConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateBackupEncryptionConfig} message CreateBackupEncryptionConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateBackupEncryptionConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.kmsKeyNames = [];
                                if (options.defaults) {
                                    object.encryptionType = options.enums === String ? "ENCRYPTION_TYPE_UNSPECIFIED" : 0;
                                    object.kmsKeyName = "";
                                }
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    object.encryptionType = options.enums === String ? $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType[message.encryptionType] === undefined ? message.encryptionType : $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType[message.encryptionType] : message.encryptionType;
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    object.kmsKeyName = message.kmsKeyName;
                                if (message.kmsKeyNames && message.kmsKeyNames.length) {
                                    object.kmsKeyNames = [];
                                    for (var j = 0; j < message.kmsKeyNames.length; ++j)
                                        object.kmsKeyNames[j] = message.kmsKeyNames[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this CreateBackupEncryptionConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateBackupEncryptionConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateBackupEncryptionConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateBackupEncryptionConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateBackupEncryptionConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateBackupEncryptionConfig";
                            };
    
                            /**
                             * EncryptionType enum.
                             * @name google.spanner.admin.database.v1.CreateBackupEncryptionConfig.EncryptionType
                             * @enum {number}
                             * @property {number} ENCRYPTION_TYPE_UNSPECIFIED=0 ENCRYPTION_TYPE_UNSPECIFIED value
                             * @property {number} USE_DATABASE_ENCRYPTION=1 USE_DATABASE_ENCRYPTION value
                             * @property {number} GOOGLE_DEFAULT_ENCRYPTION=2 GOOGLE_DEFAULT_ENCRYPTION value
                             * @property {number} CUSTOMER_MANAGED_ENCRYPTION=3 CUSTOMER_MANAGED_ENCRYPTION value
                             */
                            CreateBackupEncryptionConfig.EncryptionType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "ENCRYPTION_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "USE_DATABASE_ENCRYPTION"] = 1;
                                values[valuesById[2] = "GOOGLE_DEFAULT_ENCRYPTION"] = 2;
                                values[valuesById[3] = "CUSTOMER_MANAGED_ENCRYPTION"] = 3;
                                return values;
                            })();
    
                            return CreateBackupEncryptionConfig;
                        })();
    
                        v1.CopyBackupEncryptionConfig = (function() {
    
                            /**
                             * Properties of a CopyBackupEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICopyBackupEncryptionConfig
                             * @property {google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType|null} [encryptionType] CopyBackupEncryptionConfig encryptionType
                             * @property {string|null} [kmsKeyName] CopyBackupEncryptionConfig kmsKeyName
                             * @property {Array.<string>|null} [kmsKeyNames] CopyBackupEncryptionConfig kmsKeyNames
                             */
    
                            /**
                             * Constructs a new CopyBackupEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CopyBackupEncryptionConfig.
                             * @implements ICopyBackupEncryptionConfig
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig=} [properties] Properties to set
                             */
                            function CopyBackupEncryptionConfig(properties) {
                                this.kmsKeyNames = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CopyBackupEncryptionConfig encryptionType.
                             * @member {google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType} encryptionType
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @instance
                             */
                            CopyBackupEncryptionConfig.prototype.encryptionType = 0;
    
                            /**
                             * CopyBackupEncryptionConfig kmsKeyName.
                             * @member {string} kmsKeyName
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @instance
                             */
                            CopyBackupEncryptionConfig.prototype.kmsKeyName = "";
    
                            /**
                             * CopyBackupEncryptionConfig kmsKeyNames.
                             * @member {Array.<string>} kmsKeyNames
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @instance
                             */
                            CopyBackupEncryptionConfig.prototype.kmsKeyNames = $util.emptyArray;
    
                            /**
                             * Creates a new CopyBackupEncryptionConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CopyBackupEncryptionConfig} CopyBackupEncryptionConfig instance
                             */
                            CopyBackupEncryptionConfig.create = function create(properties) {
                                return new CopyBackupEncryptionConfig(properties);
                            };
    
                            /**
                             * Encodes the specified CopyBackupEncryptionConfig message. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupEncryptionConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig} message CopyBackupEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupEncryptionConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.encryptionType != null && Object.hasOwnProperty.call(message, "encryptionType"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.encryptionType);
                                if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                                if (message.kmsKeyNames != null && message.kmsKeyNames.length)
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.kmsKeyNames[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CopyBackupEncryptionConfig message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CopyBackupEncryptionConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.ICopyBackupEncryptionConfig} message CopyBackupEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CopyBackupEncryptionConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CopyBackupEncryptionConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CopyBackupEncryptionConfig} CopyBackupEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupEncryptionConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.encryptionType = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.kmsKeyName = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.kmsKeyNames && message.kmsKeyNames.length))
                                                message.kmsKeyNames = [];
                                            message.kmsKeyNames.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CopyBackupEncryptionConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CopyBackupEncryptionConfig} CopyBackupEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CopyBackupEncryptionConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CopyBackupEncryptionConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CopyBackupEncryptionConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    switch (message.encryptionType) {
                                    default:
                                        return "encryptionType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    if (!$util.isString(message.kmsKeyName))
                                        return "kmsKeyName: string expected";
                                if (message.kmsKeyNames != null && message.hasOwnProperty("kmsKeyNames")) {
                                    if (!Array.isArray(message.kmsKeyNames))
                                        return "kmsKeyNames: array expected";
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        if (!$util.isString(message.kmsKeyNames[i]))
                                            return "kmsKeyNames: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CopyBackupEncryptionConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CopyBackupEncryptionConfig} CopyBackupEncryptionConfig
                             */
                            CopyBackupEncryptionConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig();
                                switch (object.encryptionType) {
                                default:
                                    if (typeof object.encryptionType === "number") {
                                        message.encryptionType = object.encryptionType;
                                        break;
                                    }
                                    break;
                                case "ENCRYPTION_TYPE_UNSPECIFIED":
                                case 0:
                                    message.encryptionType = 0;
                                    break;
                                case "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION":
                                case 1:
                                    message.encryptionType = 1;
                                    break;
                                case "GOOGLE_DEFAULT_ENCRYPTION":
                                case 2:
                                    message.encryptionType = 2;
                                    break;
                                case "CUSTOMER_MANAGED_ENCRYPTION":
                                case 3:
                                    message.encryptionType = 3;
                                    break;
                                }
                                if (object.kmsKeyName != null)
                                    message.kmsKeyName = String(object.kmsKeyName);
                                if (object.kmsKeyNames) {
                                    if (!Array.isArray(object.kmsKeyNames))
                                        throw TypeError(".google.spanner.admin.database.v1.CopyBackupEncryptionConfig.kmsKeyNames: array expected");
                                    message.kmsKeyNames = [];
                                    for (var i = 0; i < object.kmsKeyNames.length; ++i)
                                        message.kmsKeyNames[i] = String(object.kmsKeyNames[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CopyBackupEncryptionConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.CopyBackupEncryptionConfig} message CopyBackupEncryptionConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CopyBackupEncryptionConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.kmsKeyNames = [];
                                if (options.defaults) {
                                    object.encryptionType = options.enums === String ? "ENCRYPTION_TYPE_UNSPECIFIED" : 0;
                                    object.kmsKeyName = "";
                                }
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    object.encryptionType = options.enums === String ? $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType[message.encryptionType] === undefined ? message.encryptionType : $root.google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType[message.encryptionType] : message.encryptionType;
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    object.kmsKeyName = message.kmsKeyName;
                                if (message.kmsKeyNames && message.kmsKeyNames.length) {
                                    object.kmsKeyNames = [];
                                    for (var j = 0; j < message.kmsKeyNames.length; ++j)
                                        object.kmsKeyNames[j] = message.kmsKeyNames[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this CopyBackupEncryptionConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CopyBackupEncryptionConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CopyBackupEncryptionConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CopyBackupEncryptionConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CopyBackupEncryptionConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CopyBackupEncryptionConfig";
                            };
    
                            /**
                             * EncryptionType enum.
                             * @name google.spanner.admin.database.v1.CopyBackupEncryptionConfig.EncryptionType
                             * @enum {number}
                             * @property {number} ENCRYPTION_TYPE_UNSPECIFIED=0 ENCRYPTION_TYPE_UNSPECIFIED value
                             * @property {number} USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION=1 USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION value
                             * @property {number} GOOGLE_DEFAULT_ENCRYPTION=2 GOOGLE_DEFAULT_ENCRYPTION value
                             * @property {number} CUSTOMER_MANAGED_ENCRYPTION=3 CUSTOMER_MANAGED_ENCRYPTION value
                             */
                            CopyBackupEncryptionConfig.EncryptionType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "ENCRYPTION_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION"] = 1;
                                values[valuesById[2] = "GOOGLE_DEFAULT_ENCRYPTION"] = 2;
                                values[valuesById[3] = "CUSTOMER_MANAGED_ENCRYPTION"] = 3;
                                return values;
                            })();
    
                            return CopyBackupEncryptionConfig;
                        })();
    
                        v1.FullBackupSpec = (function() {
    
                            /**
                             * Properties of a FullBackupSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IFullBackupSpec
                             */
    
                            /**
                             * Constructs a new FullBackupSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a FullBackupSpec.
                             * @implements IFullBackupSpec
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IFullBackupSpec=} [properties] Properties to set
                             */
                            function FullBackupSpec(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Creates a new FullBackupSpec instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IFullBackupSpec=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.FullBackupSpec} FullBackupSpec instance
                             */
                            FullBackupSpec.create = function create(properties) {
                                return new FullBackupSpec(properties);
                            };
    
                            /**
                             * Encodes the specified FullBackupSpec message. Does not implicitly {@link google.spanner.admin.database.v1.FullBackupSpec.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IFullBackupSpec} message FullBackupSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            FullBackupSpec.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified FullBackupSpec message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.FullBackupSpec.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IFullBackupSpec} message FullBackupSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            FullBackupSpec.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a FullBackupSpec message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.FullBackupSpec} FullBackupSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            FullBackupSpec.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.FullBackupSpec();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a FullBackupSpec message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.FullBackupSpec} FullBackupSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            FullBackupSpec.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a FullBackupSpec message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            FullBackupSpec.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                return null;
                            };
    
                            /**
                             * Creates a FullBackupSpec message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.FullBackupSpec} FullBackupSpec
                             */
                            FullBackupSpec.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.FullBackupSpec)
                                    return object;
                                return new $root.google.spanner.admin.database.v1.FullBackupSpec();
                            };
    
                            /**
                             * Creates a plain object from a FullBackupSpec message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.FullBackupSpec} message FullBackupSpec
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            FullBackupSpec.toObject = function toObject() {
                                return {};
                            };
    
                            /**
                             * Converts this FullBackupSpec to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            FullBackupSpec.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for FullBackupSpec
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.FullBackupSpec
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            FullBackupSpec.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.FullBackupSpec";
                            };
    
                            return FullBackupSpec;
                        })();
    
                        v1.IncrementalBackupSpec = (function() {
    
                            /**
                             * Properties of an IncrementalBackupSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IIncrementalBackupSpec
                             */
    
                            /**
                             * Constructs a new IncrementalBackupSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an IncrementalBackupSpec.
                             * @implements IIncrementalBackupSpec
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IIncrementalBackupSpec=} [properties] Properties to set
                             */
                            function IncrementalBackupSpec(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Creates a new IncrementalBackupSpec instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IIncrementalBackupSpec=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.IncrementalBackupSpec} IncrementalBackupSpec instance
                             */
                            IncrementalBackupSpec.create = function create(properties) {
                                return new IncrementalBackupSpec(properties);
                            };
    
                            /**
                             * Encodes the specified IncrementalBackupSpec message. Does not implicitly {@link google.spanner.admin.database.v1.IncrementalBackupSpec.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IIncrementalBackupSpec} message IncrementalBackupSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            IncrementalBackupSpec.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified IncrementalBackupSpec message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.IncrementalBackupSpec.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IIncrementalBackupSpec} message IncrementalBackupSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            IncrementalBackupSpec.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an IncrementalBackupSpec message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.IncrementalBackupSpec} IncrementalBackupSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            IncrementalBackupSpec.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.IncrementalBackupSpec();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an IncrementalBackupSpec message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.IncrementalBackupSpec} IncrementalBackupSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            IncrementalBackupSpec.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an IncrementalBackupSpec message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            IncrementalBackupSpec.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                return null;
                            };
    
                            /**
                             * Creates an IncrementalBackupSpec message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.IncrementalBackupSpec} IncrementalBackupSpec
                             */
                            IncrementalBackupSpec.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.IncrementalBackupSpec)
                                    return object;
                                return new $root.google.spanner.admin.database.v1.IncrementalBackupSpec();
                            };
    
                            /**
                             * Creates a plain object from an IncrementalBackupSpec message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IncrementalBackupSpec} message IncrementalBackupSpec
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            IncrementalBackupSpec.toObject = function toObject() {
                                return {};
                            };
    
                            /**
                             * Converts this IncrementalBackupSpec to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            IncrementalBackupSpec.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for IncrementalBackupSpec
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.IncrementalBackupSpec
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            IncrementalBackupSpec.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.IncrementalBackupSpec";
                            };
    
                            return IncrementalBackupSpec;
                        })();
    
                        v1.BackupInstancePartition = (function() {
    
                            /**
                             * Properties of a BackupInstancePartition.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IBackupInstancePartition
                             * @property {string|null} [instancePartition] BackupInstancePartition instancePartition
                             */
    
                            /**
                             * Constructs a new BackupInstancePartition.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a BackupInstancePartition.
                             * @implements IBackupInstancePartition
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IBackupInstancePartition=} [properties] Properties to set
                             */
                            function BackupInstancePartition(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * BackupInstancePartition instancePartition.
                             * @member {string} instancePartition
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @instance
                             */
                            BackupInstancePartition.prototype.instancePartition = "";
    
                            /**
                             * Creates a new BackupInstancePartition instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInstancePartition=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.BackupInstancePartition} BackupInstancePartition instance
                             */
                            BackupInstancePartition.create = function create(properties) {
                                return new BackupInstancePartition(properties);
                            };
    
                            /**
                             * Encodes the specified BackupInstancePartition message. Does not implicitly {@link google.spanner.admin.database.v1.BackupInstancePartition.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInstancePartition} message BackupInstancePartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupInstancePartition.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instancePartition != null && Object.hasOwnProperty.call(message, "instancePartition"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.instancePartition);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified BackupInstancePartition message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.BackupInstancePartition.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupInstancePartition} message BackupInstancePartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupInstancePartition.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a BackupInstancePartition message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.BackupInstancePartition} BackupInstancePartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupInstancePartition.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.BackupInstancePartition();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instancePartition = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a BackupInstancePartition message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.BackupInstancePartition} BackupInstancePartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupInstancePartition.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a BackupInstancePartition message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            BackupInstancePartition.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    if (!$util.isString(message.instancePartition))
                                        return "instancePartition: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a BackupInstancePartition message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.BackupInstancePartition} BackupInstancePartition
                             */
                            BackupInstancePartition.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.BackupInstancePartition)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.BackupInstancePartition();
                                if (object.instancePartition != null)
                                    message.instancePartition = String(object.instancePartition);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a BackupInstancePartition message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {google.spanner.admin.database.v1.BackupInstancePartition} message BackupInstancePartition
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            BackupInstancePartition.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.instancePartition = "";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    object.instancePartition = message.instancePartition;
                                return object;
                            };
    
                            /**
                             * Converts this BackupInstancePartition to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            BackupInstancePartition.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for BackupInstancePartition
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.BackupInstancePartition
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            BackupInstancePartition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.BackupInstancePartition";
                            };
    
                            return BackupInstancePartition;
                        })();
    
                        v1.OperationProgress = (function() {
    
                            /**
                             * Properties of an OperationProgress.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IOperationProgress
                             * @property {number|null} [progressPercent] OperationProgress progressPercent
                             * @property {google.protobuf.ITimestamp|null} [startTime] OperationProgress startTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] OperationProgress endTime
                             */
    
                            /**
                             * Constructs a new OperationProgress.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an OperationProgress.
                             * @implements IOperationProgress
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IOperationProgress=} [properties] Properties to set
                             */
                            function OperationProgress(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * OperationProgress progressPercent.
                             * @member {number} progressPercent
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.progressPercent = 0;
    
                            /**
                             * OperationProgress startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.startTime = null;
    
                            /**
                             * OperationProgress endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.endTime = null;
    
                            /**
                             * Creates a new OperationProgress instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.database.v1.IOperationProgress=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.OperationProgress} OperationProgress instance
                             */
                            OperationProgress.create = function create(properties) {
                                return new OperationProgress(properties);
                            };
    
                            /**
                             * Encodes the specified OperationProgress message. Does not implicitly {@link google.spanner.admin.database.v1.OperationProgress.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.database.v1.IOperationProgress} message OperationProgress message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OperationProgress.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.progressPercent != null && Object.hasOwnProperty.call(message, "progressPercent"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.progressPercent);
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified OperationProgress message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.OperationProgress.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.database.v1.IOperationProgress} message OperationProgress message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OperationProgress.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an OperationProgress message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.OperationProgress} OperationProgress
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OperationProgress.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.OperationProgress();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.progressPercent = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an OperationProgress message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.OperationProgress} OperationProgress
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OperationProgress.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an OperationProgress message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            OperationProgress.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.progressPercent != null && message.hasOwnProperty("progressPercent"))
                                    if (!$util.isInteger(message.progressPercent))
                                        return "progressPercent: integer expected";
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an OperationProgress message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.OperationProgress} OperationProgress
                             */
                            OperationProgress.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.OperationProgress)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.OperationProgress();
                                if (object.progressPercent != null)
                                    message.progressPercent = object.progressPercent | 0;
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.OperationProgress.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.OperationProgress.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an OperationProgress message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.database.v1.OperationProgress} message OperationProgress
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            OperationProgress.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.progressPercent = 0;
                                    object.startTime = null;
                                    object.endTime = null;
                                }
                                if (message.progressPercent != null && message.hasOwnProperty("progressPercent"))
                                    object.progressPercent = message.progressPercent;
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this OperationProgress to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            OperationProgress.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for OperationProgress
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.OperationProgress
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            OperationProgress.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.OperationProgress";
                            };
    
                            return OperationProgress;
                        })();
    
                        v1.EncryptionConfig = (function() {
    
                            /**
                             * Properties of an EncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IEncryptionConfig
                             * @property {string|null} [kmsKeyName] EncryptionConfig kmsKeyName
                             * @property {Array.<string>|null} [kmsKeyNames] EncryptionConfig kmsKeyNames
                             */
    
                            /**
                             * Constructs a new EncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an EncryptionConfig.
                             * @implements IEncryptionConfig
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IEncryptionConfig=} [properties] Properties to set
                             */
                            function EncryptionConfig(properties) {
                                this.kmsKeyNames = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * EncryptionConfig kmsKeyName.
                             * @member {string} kmsKeyName
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @instance
                             */
                            EncryptionConfig.prototype.kmsKeyName = "";
    
                            /**
                             * EncryptionConfig kmsKeyNames.
                             * @member {Array.<string>} kmsKeyNames
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @instance
                             */
                            EncryptionConfig.prototype.kmsKeyNames = $util.emptyArray;
    
                            /**
                             * Creates a new EncryptionConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.EncryptionConfig} EncryptionConfig instance
                             */
                            EncryptionConfig.create = function create(properties) {
                                return new EncryptionConfig(properties);
                            };
    
                            /**
                             * Encodes the specified EncryptionConfig message. Does not implicitly {@link google.spanner.admin.database.v1.EncryptionConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionConfig} message EncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            EncryptionConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                                if (message.kmsKeyNames != null && message.kmsKeyNames.length)
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.kmsKeyNames[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified EncryptionConfig message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.EncryptionConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionConfig} message EncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            EncryptionConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an EncryptionConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.EncryptionConfig} EncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            EncryptionConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.EncryptionConfig();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 2: {
                                            message.kmsKeyName = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.kmsKeyNames && message.kmsKeyNames.length))
                                                message.kmsKeyNames = [];
                                            message.kmsKeyNames.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an EncryptionConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.EncryptionConfig} EncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            EncryptionConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an EncryptionConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            EncryptionConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    if (!$util.isString(message.kmsKeyName))
                                        return "kmsKeyName: string expected";
                                if (message.kmsKeyNames != null && message.hasOwnProperty("kmsKeyNames")) {
                                    if (!Array.isArray(message.kmsKeyNames))
                                        return "kmsKeyNames: array expected";
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        if (!$util.isString(message.kmsKeyNames[i]))
                                            return "kmsKeyNames: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates an EncryptionConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.EncryptionConfig} EncryptionConfig
                             */
                            EncryptionConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.EncryptionConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.EncryptionConfig();
                                if (object.kmsKeyName != null)
                                    message.kmsKeyName = String(object.kmsKeyName);
                                if (object.kmsKeyNames) {
                                    if (!Array.isArray(object.kmsKeyNames))
                                        throw TypeError(".google.spanner.admin.database.v1.EncryptionConfig.kmsKeyNames: array expected");
                                    message.kmsKeyNames = [];
                                    for (var i = 0; i < object.kmsKeyNames.length; ++i)
                                        message.kmsKeyNames[i] = String(object.kmsKeyNames[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an EncryptionConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.EncryptionConfig} message EncryptionConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            EncryptionConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.kmsKeyNames = [];
                                if (options.defaults)
                                    object.kmsKeyName = "";
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    object.kmsKeyName = message.kmsKeyName;
                                if (message.kmsKeyNames && message.kmsKeyNames.length) {
                                    object.kmsKeyNames = [];
                                    for (var j = 0; j < message.kmsKeyNames.length; ++j)
                                        object.kmsKeyNames[j] = message.kmsKeyNames[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this EncryptionConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            EncryptionConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for EncryptionConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.EncryptionConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            EncryptionConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.EncryptionConfig";
                            };
    
                            return EncryptionConfig;
                        })();
    
                        v1.EncryptionInfo = (function() {
    
                            /**
                             * Properties of an EncryptionInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IEncryptionInfo
                             * @property {google.spanner.admin.database.v1.EncryptionInfo.Type|null} [encryptionType] EncryptionInfo encryptionType
                             * @property {google.rpc.IStatus|null} [encryptionStatus] EncryptionInfo encryptionStatus
                             * @property {string|null} [kmsKeyVersion] EncryptionInfo kmsKeyVersion
                             */
    
                            /**
                             * Constructs a new EncryptionInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an EncryptionInfo.
                             * @implements IEncryptionInfo
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IEncryptionInfo=} [properties] Properties to set
                             */
                            function EncryptionInfo(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * EncryptionInfo encryptionType.
                             * @member {google.spanner.admin.database.v1.EncryptionInfo.Type} encryptionType
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @instance
                             */
                            EncryptionInfo.prototype.encryptionType = 0;
    
                            /**
                             * EncryptionInfo encryptionStatus.
                             * @member {google.rpc.IStatus|null|undefined} encryptionStatus
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @instance
                             */
                            EncryptionInfo.prototype.encryptionStatus = null;
    
                            /**
                             * EncryptionInfo kmsKeyVersion.
                             * @member {string} kmsKeyVersion
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @instance
                             */
                            EncryptionInfo.prototype.kmsKeyVersion = "";
    
                            /**
                             * Creates a new EncryptionInfo instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionInfo=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.EncryptionInfo} EncryptionInfo instance
                             */
                            EncryptionInfo.create = function create(properties) {
                                return new EncryptionInfo(properties);
                            };
    
                            /**
                             * Encodes the specified EncryptionInfo message. Does not implicitly {@link google.spanner.admin.database.v1.EncryptionInfo.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionInfo} message EncryptionInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            EncryptionInfo.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.kmsKeyVersion != null && Object.hasOwnProperty.call(message, "kmsKeyVersion"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyVersion);
                                if (message.encryptionType != null && Object.hasOwnProperty.call(message, "encryptionType"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.encryptionType);
                                if (message.encryptionStatus != null && Object.hasOwnProperty.call(message, "encryptionStatus"))
                                    $root.google.rpc.Status.encode(message.encryptionStatus, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified EncryptionInfo message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.EncryptionInfo.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IEncryptionInfo} message EncryptionInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            EncryptionInfo.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an EncryptionInfo message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.EncryptionInfo} EncryptionInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            EncryptionInfo.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.EncryptionInfo();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 3: {
                                            message.encryptionType = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.encryptionStatus = $root.google.rpc.Status.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.kmsKeyVersion = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an EncryptionInfo message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.EncryptionInfo} EncryptionInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            EncryptionInfo.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an EncryptionInfo message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            EncryptionInfo.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    switch (message.encryptionType) {
                                    default:
                                        return "encryptionType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.encryptionStatus != null && message.hasOwnProperty("encryptionStatus")) {
                                    var error = $root.google.rpc.Status.verify(message.encryptionStatus);
                                    if (error)
                                        return "encryptionStatus." + error;
                                }
                                if (message.kmsKeyVersion != null && message.hasOwnProperty("kmsKeyVersion"))
                                    if (!$util.isString(message.kmsKeyVersion))
                                        return "kmsKeyVersion: string expected";
                                return null;
                            };
    
                            /**
                             * Creates an EncryptionInfo message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.EncryptionInfo} EncryptionInfo
                             */
                            EncryptionInfo.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.EncryptionInfo)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.EncryptionInfo();
                                switch (object.encryptionType) {
                                default:
                                    if (typeof object.encryptionType === "number") {
                                        message.encryptionType = object.encryptionType;
                                        break;
                                    }
                                    break;
                                case "TYPE_UNSPECIFIED":
                                case 0:
                                    message.encryptionType = 0;
                                    break;
                                case "GOOGLE_DEFAULT_ENCRYPTION":
                                case 1:
                                    message.encryptionType = 1;
                                    break;
                                case "CUSTOMER_MANAGED_ENCRYPTION":
                                case 2:
                                    message.encryptionType = 2;
                                    break;
                                }
                                if (object.encryptionStatus != null) {
                                    if (typeof object.encryptionStatus !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.EncryptionInfo.encryptionStatus: object expected");
                                    message.encryptionStatus = $root.google.rpc.Status.fromObject(object.encryptionStatus);
                                }
                                if (object.kmsKeyVersion != null)
                                    message.kmsKeyVersion = String(object.kmsKeyVersion);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an EncryptionInfo message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.EncryptionInfo} message EncryptionInfo
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            EncryptionInfo.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.kmsKeyVersion = "";
                                    object.encryptionType = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                                    object.encryptionStatus = null;
                                }
                                if (message.kmsKeyVersion != null && message.hasOwnProperty("kmsKeyVersion"))
                                    object.kmsKeyVersion = message.kmsKeyVersion;
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    object.encryptionType = options.enums === String ? $root.google.spanner.admin.database.v1.EncryptionInfo.Type[message.encryptionType] === undefined ? message.encryptionType : $root.google.spanner.admin.database.v1.EncryptionInfo.Type[message.encryptionType] : message.encryptionType;
                                if (message.encryptionStatus != null && message.hasOwnProperty("encryptionStatus"))
                                    object.encryptionStatus = $root.google.rpc.Status.toObject(message.encryptionStatus, options);
                                return object;
                            };
    
                            /**
                             * Converts this EncryptionInfo to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            EncryptionInfo.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for EncryptionInfo
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.EncryptionInfo
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            EncryptionInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.EncryptionInfo";
                            };
    
                            /**
                             * Type enum.
                             * @name google.spanner.admin.database.v1.EncryptionInfo.Type
                             * @enum {number}
                             * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                             * @property {number} GOOGLE_DEFAULT_ENCRYPTION=1 GOOGLE_DEFAULT_ENCRYPTION value
                             * @property {number} CUSTOMER_MANAGED_ENCRYPTION=2 CUSTOMER_MANAGED_ENCRYPTION value
                             */
                            EncryptionInfo.Type = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "GOOGLE_DEFAULT_ENCRYPTION"] = 1;
                                values[valuesById[2] = "CUSTOMER_MANAGED_ENCRYPTION"] = 2;
                                return values;
                            })();
    
                            return EncryptionInfo;
                        })();
    
                        /**
                         * DatabaseDialect enum.
                         * @name google.spanner.admin.database.v1.DatabaseDialect
                         * @enum {number}
                         * @property {number} DATABASE_DIALECT_UNSPECIFIED=0 DATABASE_DIALECT_UNSPECIFIED value
                         * @property {number} GOOGLE_STANDARD_SQL=1 GOOGLE_STANDARD_SQL value
                         * @property {number} POSTGRESQL=2 POSTGRESQL value
                         */
                        v1.DatabaseDialect = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "DATABASE_DIALECT_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "GOOGLE_STANDARD_SQL"] = 1;
                            values[valuesById[2] = "POSTGRESQL"] = 2;
                            return values;
                        })();
    
                        v1.BackupScheduleSpec = (function() {
    
                            /**
                             * Properties of a BackupScheduleSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IBackupScheduleSpec
                             * @property {google.spanner.admin.database.v1.ICrontabSpec|null} [cronSpec] BackupScheduleSpec cronSpec
                             */
    
                            /**
                             * Constructs a new BackupScheduleSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a BackupScheduleSpec.
                             * @implements IBackupScheduleSpec
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IBackupScheduleSpec=} [properties] Properties to set
                             */
                            function BackupScheduleSpec(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * BackupScheduleSpec cronSpec.
                             * @member {google.spanner.admin.database.v1.ICrontabSpec|null|undefined} cronSpec
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @instance
                             */
                            BackupScheduleSpec.prototype.cronSpec = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * BackupScheduleSpec scheduleSpec.
                             * @member {"cronSpec"|undefined} scheduleSpec
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @instance
                             */
                            Object.defineProperty(BackupScheduleSpec.prototype, "scheduleSpec", {
                                get: $util.oneOfGetter($oneOfFields = ["cronSpec"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new BackupScheduleSpec instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupScheduleSpec=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.BackupScheduleSpec} BackupScheduleSpec instance
                             */
                            BackupScheduleSpec.create = function create(properties) {
                                return new BackupScheduleSpec(properties);
                            };
    
                            /**
                             * Encodes the specified BackupScheduleSpec message. Does not implicitly {@link google.spanner.admin.database.v1.BackupScheduleSpec.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupScheduleSpec} message BackupScheduleSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupScheduleSpec.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.cronSpec != null && Object.hasOwnProperty.call(message, "cronSpec"))
                                    $root.google.spanner.admin.database.v1.CrontabSpec.encode(message.cronSpec, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified BackupScheduleSpec message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.BackupScheduleSpec.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupScheduleSpec} message BackupScheduleSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupScheduleSpec.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a BackupScheduleSpec message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.BackupScheduleSpec} BackupScheduleSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupScheduleSpec.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.BackupScheduleSpec();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.cronSpec = $root.google.spanner.admin.database.v1.CrontabSpec.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a BackupScheduleSpec message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.BackupScheduleSpec} BackupScheduleSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupScheduleSpec.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a BackupScheduleSpec message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            BackupScheduleSpec.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.cronSpec != null && message.hasOwnProperty("cronSpec")) {
                                    properties.scheduleSpec = 1;
                                    {
                                        var error = $root.google.spanner.admin.database.v1.CrontabSpec.verify(message.cronSpec);
                                        if (error)
                                            return "cronSpec." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates a BackupScheduleSpec message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.BackupScheduleSpec} BackupScheduleSpec
                             */
                            BackupScheduleSpec.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.BackupScheduleSpec)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.BackupScheduleSpec();
                                if (object.cronSpec != null) {
                                    if (typeof object.cronSpec !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupScheduleSpec.cronSpec: object expected");
                                    message.cronSpec = $root.google.spanner.admin.database.v1.CrontabSpec.fromObject(object.cronSpec);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a BackupScheduleSpec message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.BackupScheduleSpec} message BackupScheduleSpec
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            BackupScheduleSpec.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (message.cronSpec != null && message.hasOwnProperty("cronSpec")) {
                                    object.cronSpec = $root.google.spanner.admin.database.v1.CrontabSpec.toObject(message.cronSpec, options);
                                    if (options.oneofs)
                                        object.scheduleSpec = "cronSpec";
                                }
                                return object;
                            };
    
                            /**
                             * Converts this BackupScheduleSpec to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            BackupScheduleSpec.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for BackupScheduleSpec
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.BackupScheduleSpec
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            BackupScheduleSpec.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.BackupScheduleSpec";
                            };
    
                            return BackupScheduleSpec;
                        })();
    
                        v1.BackupSchedule = (function() {
    
                            /**
                             * Properties of a BackupSchedule.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IBackupSchedule
                             * @property {string|null} [name] BackupSchedule name
                             * @property {google.spanner.admin.database.v1.IBackupScheduleSpec|null} [spec] BackupSchedule spec
                             * @property {google.protobuf.IDuration|null} [retentionDuration] BackupSchedule retentionDuration
                             * @property {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig|null} [encryptionConfig] BackupSchedule encryptionConfig
                             * @property {google.spanner.admin.database.v1.IFullBackupSpec|null} [fullBackupSpec] BackupSchedule fullBackupSpec
                             * @property {google.spanner.admin.database.v1.IIncrementalBackupSpec|null} [incrementalBackupSpec] BackupSchedule incrementalBackupSpec
                             * @property {google.protobuf.ITimestamp|null} [updateTime] BackupSchedule updateTime
                             */
    
                            /**
                             * Constructs a new BackupSchedule.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a BackupSchedule.
                             * @implements IBackupSchedule
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IBackupSchedule=} [properties] Properties to set
                             */
                            function BackupSchedule(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * BackupSchedule name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.name = "";
    
                            /**
                             * BackupSchedule spec.
                             * @member {google.spanner.admin.database.v1.IBackupScheduleSpec|null|undefined} spec
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.spec = null;
    
                            /**
                             * BackupSchedule retentionDuration.
                             * @member {google.protobuf.IDuration|null|undefined} retentionDuration
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.retentionDuration = null;
    
                            /**
                             * BackupSchedule encryptionConfig.
                             * @member {google.spanner.admin.database.v1.ICreateBackupEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.encryptionConfig = null;
    
                            /**
                             * BackupSchedule fullBackupSpec.
                             * @member {google.spanner.admin.database.v1.IFullBackupSpec|null|undefined} fullBackupSpec
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.fullBackupSpec = null;
    
                            /**
                             * BackupSchedule incrementalBackupSpec.
                             * @member {google.spanner.admin.database.v1.IIncrementalBackupSpec|null|undefined} incrementalBackupSpec
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.incrementalBackupSpec = null;
    
                            /**
                             * BackupSchedule updateTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            BackupSchedule.prototype.updateTime = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * BackupSchedule backupTypeSpec.
                             * @member {"fullBackupSpec"|"incrementalBackupSpec"|undefined} backupTypeSpec
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             */
                            Object.defineProperty(BackupSchedule.prototype, "backupTypeSpec", {
                                get: $util.oneOfGetter($oneOfFields = ["fullBackupSpec", "incrementalBackupSpec"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new BackupSchedule instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupSchedule=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.BackupSchedule} BackupSchedule instance
                             */
                            BackupSchedule.create = function create(properties) {
                                return new BackupSchedule(properties);
                            };
    
                            /**
                             * Encodes the specified BackupSchedule message. Does not implicitly {@link google.spanner.admin.database.v1.BackupSchedule.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupSchedule} message BackupSchedule message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupSchedule.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.retentionDuration != null && Object.hasOwnProperty.call(message, "retentionDuration"))
                                    $root.google.protobuf.Duration.encode(message.retentionDuration, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.spec != null && Object.hasOwnProperty.call(message, "spec"))
                                    $root.google.spanner.admin.database.v1.BackupScheduleSpec.encode(message.spec, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                                if (message.fullBackupSpec != null && Object.hasOwnProperty.call(message, "fullBackupSpec"))
                                    $root.google.spanner.admin.database.v1.FullBackupSpec.encode(message.fullBackupSpec, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                                if (message.incrementalBackupSpec != null && Object.hasOwnProperty.call(message, "incrementalBackupSpec"))
                                    $root.google.spanner.admin.database.v1.IncrementalBackupSpec.encode(message.incrementalBackupSpec, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                                if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                                    $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified BackupSchedule message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.BackupSchedule.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {google.spanner.admin.database.v1.IBackupSchedule} message BackupSchedule message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            BackupSchedule.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a BackupSchedule message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.BackupSchedule} BackupSchedule
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupSchedule.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.BackupSchedule();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 6: {
                                            message.spec = $root.google.spanner.admin.database.v1.BackupScheduleSpec.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.retentionDuration = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 7: {
                                            message.fullBackupSpec = $root.google.spanner.admin.database.v1.FullBackupSpec.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 8: {
                                            message.incrementalBackupSpec = $root.google.spanner.admin.database.v1.IncrementalBackupSpec.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 9: {
                                            message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a BackupSchedule message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.BackupSchedule} BackupSchedule
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            BackupSchedule.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a BackupSchedule message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            BackupSchedule.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.spec != null && message.hasOwnProperty("spec")) {
                                    var error = $root.google.spanner.admin.database.v1.BackupScheduleSpec.verify(message.spec);
                                    if (error)
                                        return "spec." + error;
                                }
                                if (message.retentionDuration != null && message.hasOwnProperty("retentionDuration")) {
                                    var error = $root.google.protobuf.Duration.verify(message.retentionDuration);
                                    if (error)
                                        return "retentionDuration." + error;
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                if (message.fullBackupSpec != null && message.hasOwnProperty("fullBackupSpec")) {
                                    properties.backupTypeSpec = 1;
                                    {
                                        var error = $root.google.spanner.admin.database.v1.FullBackupSpec.verify(message.fullBackupSpec);
                                        if (error)
                                            return "fullBackupSpec." + error;
                                    }
                                }
                                if (message.incrementalBackupSpec != null && message.hasOwnProperty("incrementalBackupSpec")) {
                                    if (properties.backupTypeSpec === 1)
                                        return "backupTypeSpec: multiple values";
                                    properties.backupTypeSpec = 1;
                                    {
                                        var error = $root.google.spanner.admin.database.v1.IncrementalBackupSpec.verify(message.incrementalBackupSpec);
                                        if (error)
                                            return "incrementalBackupSpec." + error;
                                    }
                                }
                                if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                                    if (error)
                                        return "updateTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a BackupSchedule message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.BackupSchedule} BackupSchedule
                             */
                            BackupSchedule.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.BackupSchedule)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.BackupSchedule();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.spec != null) {
                                    if (typeof object.spec !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.spec: object expected");
                                    message.spec = $root.google.spanner.admin.database.v1.BackupScheduleSpec.fromObject(object.spec);
                                }
                                if (object.retentionDuration != null) {
                                    if (typeof object.retentionDuration !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.retentionDuration: object expected");
                                    message.retentionDuration = $root.google.protobuf.Duration.fromObject(object.retentionDuration);
                                }
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                if (object.fullBackupSpec != null) {
                                    if (typeof object.fullBackupSpec !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.fullBackupSpec: object expected");
                                    message.fullBackupSpec = $root.google.spanner.admin.database.v1.FullBackupSpec.fromObject(object.fullBackupSpec);
                                }
                                if (object.incrementalBackupSpec != null) {
                                    if (typeof object.incrementalBackupSpec !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.incrementalBackupSpec: object expected");
                                    message.incrementalBackupSpec = $root.google.spanner.admin.database.v1.IncrementalBackupSpec.fromObject(object.incrementalBackupSpec);
                                }
                                if (object.updateTime != null) {
                                    if (typeof object.updateTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.BackupSchedule.updateTime: object expected");
                                    message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a BackupSchedule message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {google.spanner.admin.database.v1.BackupSchedule} message BackupSchedule
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            BackupSchedule.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.retentionDuration = null;
                                    object.encryptionConfig = null;
                                    object.spec = null;
                                    object.updateTime = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.retentionDuration != null && message.hasOwnProperty("retentionDuration"))
                                    object.retentionDuration = $root.google.protobuf.Duration.toObject(message.retentionDuration, options);
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.CreateBackupEncryptionConfig.toObject(message.encryptionConfig, options);
                                if (message.spec != null && message.hasOwnProperty("spec"))
                                    object.spec = $root.google.spanner.admin.database.v1.BackupScheduleSpec.toObject(message.spec, options);
                                if (message.fullBackupSpec != null && message.hasOwnProperty("fullBackupSpec")) {
                                    object.fullBackupSpec = $root.google.spanner.admin.database.v1.FullBackupSpec.toObject(message.fullBackupSpec, options);
                                    if (options.oneofs)
                                        object.backupTypeSpec = "fullBackupSpec";
                                }
                                if (message.incrementalBackupSpec != null && message.hasOwnProperty("incrementalBackupSpec")) {
                                    object.incrementalBackupSpec = $root.google.spanner.admin.database.v1.IncrementalBackupSpec.toObject(message.incrementalBackupSpec, options);
                                    if (options.oneofs)
                                        object.backupTypeSpec = "incrementalBackupSpec";
                                }
                                if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                                    object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this BackupSchedule to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            BackupSchedule.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for BackupSchedule
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.BackupSchedule
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            BackupSchedule.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.BackupSchedule";
                            };
    
                            return BackupSchedule;
                        })();
    
                        v1.CrontabSpec = (function() {
    
                            /**
                             * Properties of a CrontabSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICrontabSpec
                             * @property {string|null} [text] CrontabSpec text
                             * @property {string|null} [timeZone] CrontabSpec timeZone
                             * @property {google.protobuf.IDuration|null} [creationWindow] CrontabSpec creationWindow
                             */
    
                            /**
                             * Constructs a new CrontabSpec.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CrontabSpec.
                             * @implements ICrontabSpec
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICrontabSpec=} [properties] Properties to set
                             */
                            function CrontabSpec(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CrontabSpec text.
                             * @member {string} text
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @instance
                             */
                            CrontabSpec.prototype.text = "";
    
                            /**
                             * CrontabSpec timeZone.
                             * @member {string} timeZone
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @instance
                             */
                            CrontabSpec.prototype.timeZone = "";
    
                            /**
                             * CrontabSpec creationWindow.
                             * @member {google.protobuf.IDuration|null|undefined} creationWindow
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @instance
                             */
                            CrontabSpec.prototype.creationWindow = null;
    
                            /**
                             * Creates a new CrontabSpec instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.ICrontabSpec=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CrontabSpec} CrontabSpec instance
                             */
                            CrontabSpec.create = function create(properties) {
                                return new CrontabSpec(properties);
                            };
    
                            /**
                             * Encodes the specified CrontabSpec message. Does not implicitly {@link google.spanner.admin.database.v1.CrontabSpec.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.ICrontabSpec} message CrontabSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CrontabSpec.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.text != null && Object.hasOwnProperty.call(message, "text"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.text);
                                if (message.timeZone != null && Object.hasOwnProperty.call(message, "timeZone"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.timeZone);
                                if (message.creationWindow != null && Object.hasOwnProperty.call(message, "creationWindow"))
                                    $root.google.protobuf.Duration.encode(message.creationWindow, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CrontabSpec message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CrontabSpec.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.ICrontabSpec} message CrontabSpec message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CrontabSpec.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CrontabSpec message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CrontabSpec} CrontabSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CrontabSpec.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CrontabSpec();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.text = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.timeZone = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.creationWindow = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CrontabSpec message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CrontabSpec} CrontabSpec
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CrontabSpec.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CrontabSpec message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CrontabSpec.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.text != null && message.hasOwnProperty("text"))
                                    if (!$util.isString(message.text))
                                        return "text: string expected";
                                if (message.timeZone != null && message.hasOwnProperty("timeZone"))
                                    if (!$util.isString(message.timeZone))
                                        return "timeZone: string expected";
                                if (message.creationWindow != null && message.hasOwnProperty("creationWindow")) {
                                    var error = $root.google.protobuf.Duration.verify(message.creationWindow);
                                    if (error)
                                        return "creationWindow." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CrontabSpec message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CrontabSpec} CrontabSpec
                             */
                            CrontabSpec.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CrontabSpec)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CrontabSpec();
                                if (object.text != null)
                                    message.text = String(object.text);
                                if (object.timeZone != null)
                                    message.timeZone = String(object.timeZone);
                                if (object.creationWindow != null) {
                                    if (typeof object.creationWindow !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CrontabSpec.creationWindow: object expected");
                                    message.creationWindow = $root.google.protobuf.Duration.fromObject(object.creationWindow);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CrontabSpec message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {google.spanner.admin.database.v1.CrontabSpec} message CrontabSpec
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CrontabSpec.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.text = "";
                                    object.timeZone = "";
                                    object.creationWindow = null;
                                }
                                if (message.text != null && message.hasOwnProperty("text"))
                                    object.text = message.text;
                                if (message.timeZone != null && message.hasOwnProperty("timeZone"))
                                    object.timeZone = message.timeZone;
                                if (message.creationWindow != null && message.hasOwnProperty("creationWindow"))
                                    object.creationWindow = $root.google.protobuf.Duration.toObject(message.creationWindow, options);
                                return object;
                            };
    
                            /**
                             * Converts this CrontabSpec to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CrontabSpec.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CrontabSpec
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CrontabSpec
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CrontabSpec.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CrontabSpec";
                            };
    
                            return CrontabSpec;
                        })();
    
                        v1.CreateBackupScheduleRequest = (function() {
    
                            /**
                             * Properties of a CreateBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateBackupScheduleRequest
                             * @property {string|null} [parent] CreateBackupScheduleRequest parent
                             * @property {string|null} [backupScheduleId] CreateBackupScheduleRequest backupScheduleId
                             * @property {google.spanner.admin.database.v1.IBackupSchedule|null} [backupSchedule] CreateBackupScheduleRequest backupSchedule
                             */
    
                            /**
                             * Constructs a new CreateBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateBackupScheduleRequest.
                             * @implements ICreateBackupScheduleRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest=} [properties] Properties to set
                             */
                            function CreateBackupScheduleRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateBackupScheduleRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @instance
                             */
                            CreateBackupScheduleRequest.prototype.parent = "";
    
                            /**
                             * CreateBackupScheduleRequest backupScheduleId.
                             * @member {string} backupScheduleId
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @instance
                             */
                            CreateBackupScheduleRequest.prototype.backupScheduleId = "";
    
                            /**
                             * CreateBackupScheduleRequest backupSchedule.
                             * @member {google.spanner.admin.database.v1.IBackupSchedule|null|undefined} backupSchedule
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @instance
                             */
                            CreateBackupScheduleRequest.prototype.backupSchedule = null;
    
                            /**
                             * Creates a new CreateBackupScheduleRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateBackupScheduleRequest} CreateBackupScheduleRequest instance
                             */
                            CreateBackupScheduleRequest.create = function create(properties) {
                                return new CreateBackupScheduleRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateBackupScheduleRequest message. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupScheduleRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest} message CreateBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupScheduleRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.backupScheduleId != null && Object.hasOwnProperty.call(message, "backupScheduleId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.backupScheduleId);
                                if (message.backupSchedule != null && Object.hasOwnProperty.call(message, "backupSchedule"))
                                    $root.google.spanner.admin.database.v1.BackupSchedule.encode(message.backupSchedule, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateBackupScheduleRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateBackupScheduleRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest} message CreateBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateBackupScheduleRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateBackupScheduleRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateBackupScheduleRequest} CreateBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupScheduleRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateBackupScheduleRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.backupScheduleId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateBackupScheduleRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateBackupScheduleRequest} CreateBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateBackupScheduleRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateBackupScheduleRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateBackupScheduleRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.backupScheduleId != null && message.hasOwnProperty("backupScheduleId"))
                                    if (!$util.isString(message.backupScheduleId))
                                        return "backupScheduleId: string expected";
                                if (message.backupSchedule != null && message.hasOwnProperty("backupSchedule")) {
                                    var error = $root.google.spanner.admin.database.v1.BackupSchedule.verify(message.backupSchedule);
                                    if (error)
                                        return "backupSchedule." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateBackupScheduleRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateBackupScheduleRequest} CreateBackupScheduleRequest
                             */
                            CreateBackupScheduleRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateBackupScheduleRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateBackupScheduleRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.backupScheduleId != null)
                                    message.backupScheduleId = String(object.backupScheduleId);
                                if (object.backupSchedule != null) {
                                    if (typeof object.backupSchedule !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateBackupScheduleRequest.backupSchedule: object expected");
                                    message.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.fromObject(object.backupSchedule);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateBackupScheduleRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateBackupScheduleRequest} message CreateBackupScheduleRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateBackupScheduleRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.backupScheduleId = "";
                                    object.backupSchedule = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.backupScheduleId != null && message.hasOwnProperty("backupScheduleId"))
                                    object.backupScheduleId = message.backupScheduleId;
                                if (message.backupSchedule != null && message.hasOwnProperty("backupSchedule"))
                                    object.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.toObject(message.backupSchedule, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateBackupScheduleRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateBackupScheduleRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateBackupScheduleRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateBackupScheduleRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateBackupScheduleRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateBackupScheduleRequest";
                            };
    
                            return CreateBackupScheduleRequest;
                        })();
    
                        v1.GetBackupScheduleRequest = (function() {
    
                            /**
                             * Properties of a GetBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IGetBackupScheduleRequest
                             * @property {string|null} [name] GetBackupScheduleRequest name
                             */
    
                            /**
                             * Constructs a new GetBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a GetBackupScheduleRequest.
                             * @implements IGetBackupScheduleRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest=} [properties] Properties to set
                             */
                            function GetBackupScheduleRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetBackupScheduleRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @instance
                             */
                            GetBackupScheduleRequest.prototype.name = "";
    
                            /**
                             * Creates a new GetBackupScheduleRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.GetBackupScheduleRequest} GetBackupScheduleRequest instance
                             */
                            GetBackupScheduleRequest.create = function create(properties) {
                                return new GetBackupScheduleRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetBackupScheduleRequest message. Does not implicitly {@link google.spanner.admin.database.v1.GetBackupScheduleRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest} message GetBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetBackupScheduleRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetBackupScheduleRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.GetBackupScheduleRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest} message GetBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetBackupScheduleRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetBackupScheduleRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.GetBackupScheduleRequest} GetBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetBackupScheduleRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.GetBackupScheduleRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetBackupScheduleRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.GetBackupScheduleRequest} GetBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetBackupScheduleRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetBackupScheduleRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetBackupScheduleRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetBackupScheduleRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.GetBackupScheduleRequest} GetBackupScheduleRequest
                             */
                            GetBackupScheduleRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.GetBackupScheduleRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.GetBackupScheduleRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetBackupScheduleRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.GetBackupScheduleRequest} message GetBackupScheduleRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetBackupScheduleRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this GetBackupScheduleRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetBackupScheduleRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetBackupScheduleRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.GetBackupScheduleRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetBackupScheduleRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.GetBackupScheduleRequest";
                            };
    
                            return GetBackupScheduleRequest;
                        })();
    
                        v1.DeleteBackupScheduleRequest = (function() {
    
                            /**
                             * Properties of a DeleteBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDeleteBackupScheduleRequest
                             * @property {string|null} [name] DeleteBackupScheduleRequest name
                             */
    
                            /**
                             * Constructs a new DeleteBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DeleteBackupScheduleRequest.
                             * @implements IDeleteBackupScheduleRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest=} [properties] Properties to set
                             */
                            function DeleteBackupScheduleRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DeleteBackupScheduleRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @instance
                             */
                            DeleteBackupScheduleRequest.prototype.name = "";
    
                            /**
                             * Creates a new DeleteBackupScheduleRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.DeleteBackupScheduleRequest} DeleteBackupScheduleRequest instance
                             */
                            DeleteBackupScheduleRequest.create = function create(properties) {
                                return new DeleteBackupScheduleRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DeleteBackupScheduleRequest message. Does not implicitly {@link google.spanner.admin.database.v1.DeleteBackupScheduleRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest} message DeleteBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteBackupScheduleRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DeleteBackupScheduleRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.DeleteBackupScheduleRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest} message DeleteBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteBackupScheduleRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DeleteBackupScheduleRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.DeleteBackupScheduleRequest} DeleteBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteBackupScheduleRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.DeleteBackupScheduleRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DeleteBackupScheduleRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.DeleteBackupScheduleRequest} DeleteBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteBackupScheduleRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DeleteBackupScheduleRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DeleteBackupScheduleRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DeleteBackupScheduleRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.DeleteBackupScheduleRequest} DeleteBackupScheduleRequest
                             */
                            DeleteBackupScheduleRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.DeleteBackupScheduleRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.DeleteBackupScheduleRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DeleteBackupScheduleRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.DeleteBackupScheduleRequest} message DeleteBackupScheduleRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DeleteBackupScheduleRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this DeleteBackupScheduleRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DeleteBackupScheduleRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DeleteBackupScheduleRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.DeleteBackupScheduleRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DeleteBackupScheduleRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.DeleteBackupScheduleRequest";
                            };
    
                            return DeleteBackupScheduleRequest;
                        })();
    
                        v1.ListBackupSchedulesRequest = (function() {
    
                            /**
                             * Properties of a ListBackupSchedulesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupSchedulesRequest
                             * @property {string|null} [parent] ListBackupSchedulesRequest parent
                             * @property {number|null} [pageSize] ListBackupSchedulesRequest pageSize
                             * @property {string|null} [pageToken] ListBackupSchedulesRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListBackupSchedulesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupSchedulesRequest.
                             * @implements IListBackupSchedulesRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest=} [properties] Properties to set
                             */
                            function ListBackupSchedulesRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupSchedulesRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @instance
                             */
                            ListBackupSchedulesRequest.prototype.parent = "";
    
                            /**
                             * ListBackupSchedulesRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @instance
                             */
                            ListBackupSchedulesRequest.prototype.pageSize = 0;
    
                            /**
                             * ListBackupSchedulesRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @instance
                             */
                            ListBackupSchedulesRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListBackupSchedulesRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesRequest} ListBackupSchedulesRequest instance
                             */
                            ListBackupSchedulesRequest.create = function create(properties) {
                                return new ListBackupSchedulesRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupSchedulesRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupSchedulesRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest} message ListBackupSchedulesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupSchedulesRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupSchedulesRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupSchedulesRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest} message ListBackupSchedulesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupSchedulesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupSchedulesRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesRequest} ListBackupSchedulesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupSchedulesRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupSchedulesRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupSchedulesRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesRequest} ListBackupSchedulesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupSchedulesRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupSchedulesRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupSchedulesRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupSchedulesRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesRequest} ListBackupSchedulesRequest
                             */
                            ListBackupSchedulesRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupSchedulesRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupSchedulesRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupSchedulesRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupSchedulesRequest} message ListBackupSchedulesRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupSchedulesRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupSchedulesRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupSchedulesRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupSchedulesRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupSchedulesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupSchedulesRequest";
                            };
    
                            return ListBackupSchedulesRequest;
                        })();
    
                        v1.ListBackupSchedulesResponse = (function() {
    
                            /**
                             * Properties of a ListBackupSchedulesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListBackupSchedulesResponse
                             * @property {Array.<google.spanner.admin.database.v1.IBackupSchedule>|null} [backupSchedules] ListBackupSchedulesResponse backupSchedules
                             * @property {string|null} [nextPageToken] ListBackupSchedulesResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListBackupSchedulesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListBackupSchedulesResponse.
                             * @implements IListBackupSchedulesResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesResponse=} [properties] Properties to set
                             */
                            function ListBackupSchedulesResponse(properties) {
                                this.backupSchedules = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListBackupSchedulesResponse backupSchedules.
                             * @member {Array.<google.spanner.admin.database.v1.IBackupSchedule>} backupSchedules
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @instance
                             */
                            ListBackupSchedulesResponse.prototype.backupSchedules = $util.emptyArray;
    
                            /**
                             * ListBackupSchedulesResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @instance
                             */
                            ListBackupSchedulesResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListBackupSchedulesResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesResponse} ListBackupSchedulesResponse instance
                             */
                            ListBackupSchedulesResponse.create = function create(properties) {
                                return new ListBackupSchedulesResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListBackupSchedulesResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupSchedulesResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesResponse} message ListBackupSchedulesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupSchedulesResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.backupSchedules != null && message.backupSchedules.length)
                                    for (var i = 0; i < message.backupSchedules.length; ++i)
                                        $root.google.spanner.admin.database.v1.BackupSchedule.encode(message.backupSchedules[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListBackupSchedulesResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListBackupSchedulesResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesResponse} message ListBackupSchedulesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListBackupSchedulesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListBackupSchedulesResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesResponse} ListBackupSchedulesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupSchedulesResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListBackupSchedulesResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.backupSchedules && message.backupSchedules.length))
                                                message.backupSchedules = [];
                                            message.backupSchedules.push($root.google.spanner.admin.database.v1.BackupSchedule.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListBackupSchedulesResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesResponse} ListBackupSchedulesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListBackupSchedulesResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListBackupSchedulesResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListBackupSchedulesResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.backupSchedules != null && message.hasOwnProperty("backupSchedules")) {
                                    if (!Array.isArray(message.backupSchedules))
                                        return "backupSchedules: array expected";
                                    for (var i = 0; i < message.backupSchedules.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.BackupSchedule.verify(message.backupSchedules[i]);
                                        if (error)
                                            return "backupSchedules." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListBackupSchedulesResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListBackupSchedulesResponse} ListBackupSchedulesResponse
                             */
                            ListBackupSchedulesResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListBackupSchedulesResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListBackupSchedulesResponse();
                                if (object.backupSchedules) {
                                    if (!Array.isArray(object.backupSchedules))
                                        throw TypeError(".google.spanner.admin.database.v1.ListBackupSchedulesResponse.backupSchedules: array expected");
                                    message.backupSchedules = [];
                                    for (var i = 0; i < object.backupSchedules.length; ++i) {
                                        if (typeof object.backupSchedules[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListBackupSchedulesResponse.backupSchedules: object expected");
                                        message.backupSchedules[i] = $root.google.spanner.admin.database.v1.BackupSchedule.fromObject(object.backupSchedules[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListBackupSchedulesResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListBackupSchedulesResponse} message ListBackupSchedulesResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListBackupSchedulesResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.backupSchedules = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.backupSchedules && message.backupSchedules.length) {
                                    object.backupSchedules = [];
                                    for (var j = 0; j < message.backupSchedules.length; ++j)
                                        object.backupSchedules[j] = $root.google.spanner.admin.database.v1.BackupSchedule.toObject(message.backupSchedules[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListBackupSchedulesResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListBackupSchedulesResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListBackupSchedulesResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListBackupSchedulesResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListBackupSchedulesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListBackupSchedulesResponse";
                            };
    
                            return ListBackupSchedulesResponse;
                        })();
    
                        v1.UpdateBackupScheduleRequest = (function() {
    
                            /**
                             * Properties of an UpdateBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateBackupScheduleRequest
                             * @property {google.spanner.admin.database.v1.IBackupSchedule|null} [backupSchedule] UpdateBackupScheduleRequest backupSchedule
                             * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateBackupScheduleRequest updateMask
                             */
    
                            /**
                             * Constructs a new UpdateBackupScheduleRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateBackupScheduleRequest.
                             * @implements IUpdateBackupScheduleRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest=} [properties] Properties to set
                             */
                            function UpdateBackupScheduleRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateBackupScheduleRequest backupSchedule.
                             * @member {google.spanner.admin.database.v1.IBackupSchedule|null|undefined} backupSchedule
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @instance
                             */
                            UpdateBackupScheduleRequest.prototype.backupSchedule = null;
    
                            /**
                             * UpdateBackupScheduleRequest updateMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @instance
                             */
                            UpdateBackupScheduleRequest.prototype.updateMask = null;
    
                            /**
                             * Creates a new UpdateBackupScheduleRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateBackupScheduleRequest} UpdateBackupScheduleRequest instance
                             */
                            UpdateBackupScheduleRequest.create = function create(properties) {
                                return new UpdateBackupScheduleRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateBackupScheduleRequest message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateBackupScheduleRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest} message UpdateBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateBackupScheduleRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.backupSchedule != null && Object.hasOwnProperty.call(message, "backupSchedule"))
                                    $root.google.spanner.admin.database.v1.BackupSchedule.encode(message.backupSchedule, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                                    $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateBackupScheduleRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateBackupScheduleRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest} message UpdateBackupScheduleRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateBackupScheduleRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateBackupScheduleRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateBackupScheduleRequest} UpdateBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateBackupScheduleRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateBackupScheduleRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateBackupScheduleRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateBackupScheduleRequest} UpdateBackupScheduleRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateBackupScheduleRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateBackupScheduleRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateBackupScheduleRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.backupSchedule != null && message.hasOwnProperty("backupSchedule")) {
                                    var error = $root.google.spanner.admin.database.v1.BackupSchedule.verify(message.backupSchedule);
                                    if (error)
                                        return "backupSchedule." + error;
                                }
                                if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                                    if (error)
                                        return "updateMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateBackupScheduleRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateBackupScheduleRequest} UpdateBackupScheduleRequest
                             */
                            UpdateBackupScheduleRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateBackupScheduleRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateBackupScheduleRequest();
                                if (object.backupSchedule != null) {
                                    if (typeof object.backupSchedule !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateBackupScheduleRequest.backupSchedule: object expected");
                                    message.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.fromObject(object.backupSchedule);
                                }
                                if (object.updateMask != null) {
                                    if (typeof object.updateMask !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateBackupScheduleRequest.updateMask: object expected");
                                    message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateBackupScheduleRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateBackupScheduleRequest} message UpdateBackupScheduleRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateBackupScheduleRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.backupSchedule = null;
                                    object.updateMask = null;
                                }
                                if (message.backupSchedule != null && message.hasOwnProperty("backupSchedule"))
                                    object.backupSchedule = $root.google.spanner.admin.database.v1.BackupSchedule.toObject(message.backupSchedule, options);
                                if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                                    object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateBackupScheduleRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateBackupScheduleRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateBackupScheduleRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateBackupScheduleRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateBackupScheduleRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateBackupScheduleRequest";
                            };
    
                            return UpdateBackupScheduleRequest;
                        })();
    
                        v1.DatabaseAdmin = (function() {
    
                            /**
                             * Constructs a new DatabaseAdmin service.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DatabaseAdmin
                             * @extends $protobuf.rpc.Service
                             * @constructor
                             * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                             * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                             * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                             */
                            function DatabaseAdmin(rpcImpl, requestDelimited, responseDelimited) {
                                $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                            }
    
                            (DatabaseAdmin.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = DatabaseAdmin;
    
                            /**
                             * Creates new DatabaseAdmin service using the specified rpc implementation.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @static
                             * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                             * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                             * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                             * @returns {DatabaseAdmin} RPC service. Useful where requests and/or responses are streamed.
                             */
                            DatabaseAdmin.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                                return new this(rpcImpl, requestDelimited, responseDelimited);
                            };
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listDatabases}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListDatabasesCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListDatabasesResponse} [response] ListDatabasesResponse
                             */
    
                            /**
                             * Calls ListDatabases.
                             * @function listDatabases
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest} request ListDatabasesRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListDatabasesCallback} callback Node-style callback called with the error, if any, and ListDatabasesResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listDatabases = function listDatabases(request, callback) {
                                return this.rpcCall(listDatabases, $root.google.spanner.admin.database.v1.ListDatabasesRequest, $root.google.spanner.admin.database.v1.ListDatabasesResponse, request, callback);
                            }, "name", { value: "ListDatabases" });
    
                            /**
                             * Calls ListDatabases.
                             * @function listDatabases
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest} request ListDatabasesRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListDatabasesResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|createDatabase}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef CreateDatabaseCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CreateDatabase.
                             * @function createDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest} request CreateDatabaseRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabaseCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.createDatabase = function createDatabase(request, callback) {
                                return this.rpcCall(createDatabase, $root.google.spanner.admin.database.v1.CreateDatabaseRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CreateDatabase" });
    
                            /**
                             * Calls CreateDatabase.
                             * @function createDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest} request CreateDatabaseRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|getDatabase}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef GetDatabaseCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.Database} [response] Database
                             */
    
                            /**
                             * Calls GetDatabase.
                             * @function getDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest} request GetDatabaseRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseCallback} callback Node-style callback called with the error, if any, and Database
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.getDatabase = function getDatabase(request, callback) {
                                return this.rpcCall(getDatabase, $root.google.spanner.admin.database.v1.GetDatabaseRequest, $root.google.spanner.admin.database.v1.Database, request, callback);
                            }, "name", { value: "GetDatabase" });
    
                            /**
                             * Calls GetDatabase.
                             * @function getDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest} request GetDatabaseRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.Database>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|updateDatabase}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef UpdateDatabaseCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls UpdateDatabase.
                             * @function updateDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest} request UpdateDatabaseRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.updateDatabase = function updateDatabase(request, callback) {
                                return this.rpcCall(updateDatabase, $root.google.spanner.admin.database.v1.UpdateDatabaseRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "UpdateDatabase" });
    
                            /**
                             * Calls UpdateDatabase.
                             * @function updateDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest} request UpdateDatabaseRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|updateDatabaseDdl}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef UpdateDatabaseDdlCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls UpdateDatabaseDdl.
                             * @function updateDatabaseDdl
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest} request UpdateDatabaseDdlRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdlCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.updateDatabaseDdl = function updateDatabaseDdl(request, callback) {
                                return this.rpcCall(updateDatabaseDdl, $root.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "UpdateDatabaseDdl" });
    
                            /**
                             * Calls UpdateDatabaseDdl.
                             * @function updateDatabaseDdl
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest} request UpdateDatabaseDdlRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|dropDatabase}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef DropDatabaseCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DropDatabase.
                             * @function dropDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest} request DropDatabaseRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.DropDatabaseCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.dropDatabase = function dropDatabase(request, callback) {
                                return this.rpcCall(dropDatabase, $root.google.spanner.admin.database.v1.DropDatabaseRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DropDatabase" });
    
                            /**
                             * Calls DropDatabase.
                             * @function dropDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest} request DropDatabaseRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|getDatabaseDdl}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef GetDatabaseDdlCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.GetDatabaseDdlResponse} [response] GetDatabaseDdlResponse
                             */
    
                            /**
                             * Calls GetDatabaseDdl.
                             * @function getDatabaseDdl
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest} request GetDatabaseDdlRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdlCallback} callback Node-style callback called with the error, if any, and GetDatabaseDdlResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.getDatabaseDdl = function getDatabaseDdl(request, callback) {
                                return this.rpcCall(getDatabaseDdl, $root.google.spanner.admin.database.v1.GetDatabaseDdlRequest, $root.google.spanner.admin.database.v1.GetDatabaseDdlResponse, request, callback);
                            }, "name", { value: "GetDatabaseDdl" });
    
                            /**
                             * Calls GetDatabaseDdl.
                             * @function getDatabaseDdl
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest} request GetDatabaseDdlRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.GetDatabaseDdlResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|setIamPolicy}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef SetIamPolicyCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.Policy} [response] Policy
                             */
    
                            /**
                             * Calls SetIamPolicy.
                             * @function setIamPolicy
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.SetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.setIamPolicy = function setIamPolicy(request, callback) {
                                return this.rpcCall(setIamPolicy, $root.google.iam.v1.SetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                            }, "name", { value: "SetIamPolicy" });
    
                            /**
                             * Calls SetIamPolicy.
                             * @function setIamPolicy
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                             * @returns {Promise<google.iam.v1.Policy>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|getIamPolicy}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef GetIamPolicyCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.Policy} [response] Policy
                             */
    
                            /**
                             * Calls GetIamPolicy.
                             * @function getIamPolicy
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.GetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.getIamPolicy = function getIamPolicy(request, callback) {
                                return this.rpcCall(getIamPolicy, $root.google.iam.v1.GetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                            }, "name", { value: "GetIamPolicy" });
    
                            /**
                             * Calls GetIamPolicy.
                             * @function getIamPolicy
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                             * @returns {Promise<google.iam.v1.Policy>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|testIamPermissions}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef TestIamPermissionsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.TestIamPermissionsResponse} [response] TestIamPermissionsResponse
                             */
    
                            /**
                             * Calls TestIamPermissions.
                             * @function testIamPermissions
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.TestIamPermissionsCallback} callback Node-style callback called with the error, if any, and TestIamPermissionsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.testIamPermissions = function testIamPermissions(request, callback) {
                                return this.rpcCall(testIamPermissions, $root.google.iam.v1.TestIamPermissionsRequest, $root.google.iam.v1.TestIamPermissionsResponse, request, callback);
                            }, "name", { value: "TestIamPermissions" });
    
                            /**
                             * Calls TestIamPermissions.
                             * @function testIamPermissions
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                             * @returns {Promise<google.iam.v1.TestIamPermissionsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|createBackup}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef CreateBackupCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CreateBackup.
                             * @function createBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest} request CreateBackupRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.CreateBackupCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.createBackup = function createBackup(request, callback) {
                                return this.rpcCall(createBackup, $root.google.spanner.admin.database.v1.CreateBackupRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CreateBackup" });
    
                            /**
                             * Calls CreateBackup.
                             * @function createBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateBackupRequest} request CreateBackupRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|copyBackup}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef CopyBackupCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CopyBackup.
                             * @function copyBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest} request CopyBackupRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.CopyBackupCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.copyBackup = function copyBackup(request, callback) {
                                return this.rpcCall(copyBackup, $root.google.spanner.admin.database.v1.CopyBackupRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CopyBackup" });
    
                            /**
                             * Calls CopyBackup.
                             * @function copyBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICopyBackupRequest} request CopyBackupRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|getBackup}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef GetBackupCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.Backup} [response] Backup
                             */
    
                            /**
                             * Calls GetBackup.
                             * @function getBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest} request GetBackupRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.GetBackupCallback} callback Node-style callback called with the error, if any, and Backup
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.getBackup = function getBackup(request, callback) {
                                return this.rpcCall(getBackup, $root.google.spanner.admin.database.v1.GetBackupRequest, $root.google.spanner.admin.database.v1.Backup, request, callback);
                            }, "name", { value: "GetBackup" });
    
                            /**
                             * Calls GetBackup.
                             * @function getBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetBackupRequest} request GetBackupRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.Backup>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|updateBackup}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef UpdateBackupCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.Backup} [response] Backup
                             */
    
                            /**
                             * Calls UpdateBackup.
                             * @function updateBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest} request UpdateBackupRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupCallback} callback Node-style callback called with the error, if any, and Backup
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.updateBackup = function updateBackup(request, callback) {
                                return this.rpcCall(updateBackup, $root.google.spanner.admin.database.v1.UpdateBackupRequest, $root.google.spanner.admin.database.v1.Backup, request, callback);
                            }, "name", { value: "UpdateBackup" });
    
                            /**
                             * Calls UpdateBackup.
                             * @function updateBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateBackupRequest} request UpdateBackupRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.Backup>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|deleteBackup}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef DeleteBackupCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DeleteBackup.
                             * @function deleteBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest} request DeleteBackupRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackupCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.deleteBackup = function deleteBackup(request, callback) {
                                return this.rpcCall(deleteBackup, $root.google.spanner.admin.database.v1.DeleteBackupRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DeleteBackup" });
    
                            /**
                             * Calls DeleteBackup.
                             * @function deleteBackup
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDeleteBackupRequest} request DeleteBackupRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listBackups}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListBackupsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListBackupsResponse} [response] ListBackupsResponse
                             */
    
                            /**
                             * Calls ListBackups.
                             * @function listBackups
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest} request ListBackupsRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListBackupsCallback} callback Node-style callback called with the error, if any, and ListBackupsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listBackups = function listBackups(request, callback) {
                                return this.rpcCall(listBackups, $root.google.spanner.admin.database.v1.ListBackupsRequest, $root.google.spanner.admin.database.v1.ListBackupsResponse, request, callback);
                            }, "name", { value: "ListBackups" });
    
                            /**
                             * Calls ListBackups.
                             * @function listBackups
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupsRequest} request ListBackupsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListBackupsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|restoreDatabase}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef RestoreDatabaseCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls RestoreDatabase.
                             * @function restoreDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest} request RestoreDatabaseRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabaseCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.restoreDatabase = function restoreDatabase(request, callback) {
                                return this.rpcCall(restoreDatabase, $root.google.spanner.admin.database.v1.RestoreDatabaseRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "RestoreDatabase" });
    
                            /**
                             * Calls RestoreDatabase.
                             * @function restoreDatabase
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest} request RestoreDatabaseRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listDatabaseOperations}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListDatabaseOperationsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} [response] ListDatabaseOperationsResponse
                             */
    
                            /**
                             * Calls ListDatabaseOperations.
                             * @function listDatabaseOperations
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest} request ListDatabaseOperationsRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperationsCallback} callback Node-style callback called with the error, if any, and ListDatabaseOperationsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listDatabaseOperations = function listDatabaseOperations(request, callback) {
                                return this.rpcCall(listDatabaseOperations, $root.google.spanner.admin.database.v1.ListDatabaseOperationsRequest, $root.google.spanner.admin.database.v1.ListDatabaseOperationsResponse, request, callback);
                            }, "name", { value: "ListDatabaseOperations" });
    
                            /**
                             * Calls ListDatabaseOperations.
                             * @function listDatabaseOperations
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest} request ListDatabaseOperationsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListDatabaseOperationsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listBackupOperations}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListBackupOperationsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListBackupOperationsResponse} [response] ListBackupOperationsResponse
                             */
    
                            /**
                             * Calls ListBackupOperations.
                             * @function listBackupOperations
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest} request ListBackupOperationsRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperationsCallback} callback Node-style callback called with the error, if any, and ListBackupOperationsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listBackupOperations = function listBackupOperations(request, callback) {
                                return this.rpcCall(listBackupOperations, $root.google.spanner.admin.database.v1.ListBackupOperationsRequest, $root.google.spanner.admin.database.v1.ListBackupOperationsResponse, request, callback);
                            }, "name", { value: "ListBackupOperations" });
    
                            /**
                             * Calls ListBackupOperations.
                             * @function listBackupOperations
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupOperationsRequest} request ListBackupOperationsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListBackupOperationsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listDatabaseRoles}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListDatabaseRolesCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListDatabaseRolesResponse} [response] ListDatabaseRolesResponse
                             */
    
                            /**
                             * Calls ListDatabaseRoles.
                             * @function listDatabaseRoles
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest} request ListDatabaseRolesRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRolesCallback} callback Node-style callback called with the error, if any, and ListDatabaseRolesResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listDatabaseRoles = function listDatabaseRoles(request, callback) {
                                return this.rpcCall(listDatabaseRoles, $root.google.spanner.admin.database.v1.ListDatabaseRolesRequest, $root.google.spanner.admin.database.v1.ListDatabaseRolesResponse, request, callback);
                            }, "name", { value: "ListDatabaseRoles" });
    
                            /**
                             * Calls ListDatabaseRoles.
                             * @function listDatabaseRoles
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest} request ListDatabaseRolesRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListDatabaseRolesResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|addSplitPoints}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef AddSplitPointsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.AddSplitPointsResponse} [response] AddSplitPointsResponse
                             */
    
                            /**
                             * Calls AddSplitPoints.
                             * @function addSplitPoints
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest} request AddSplitPointsRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.AddSplitPointsCallback} callback Node-style callback called with the error, if any, and AddSplitPointsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.addSplitPoints = function addSplitPoints(request, callback) {
                                return this.rpcCall(addSplitPoints, $root.google.spanner.admin.database.v1.AddSplitPointsRequest, $root.google.spanner.admin.database.v1.AddSplitPointsResponse, request, callback);
                            }, "name", { value: "AddSplitPoints" });
    
                            /**
                             * Calls AddSplitPoints.
                             * @function addSplitPoints
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest} request AddSplitPointsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.AddSplitPointsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|createBackupSchedule}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef CreateBackupScheduleCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.BackupSchedule} [response] BackupSchedule
                             */
    
                            /**
                             * Calls CreateBackupSchedule.
                             * @function createBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest} request CreateBackupScheduleRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.CreateBackupScheduleCallback} callback Node-style callback called with the error, if any, and BackupSchedule
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.createBackupSchedule = function createBackupSchedule(request, callback) {
                                return this.rpcCall(createBackupSchedule, $root.google.spanner.admin.database.v1.CreateBackupScheduleRequest, $root.google.spanner.admin.database.v1.BackupSchedule, request, callback);
                            }, "name", { value: "CreateBackupSchedule" });
    
                            /**
                             * Calls CreateBackupSchedule.
                             * @function createBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.ICreateBackupScheduleRequest} request CreateBackupScheduleRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.BackupSchedule>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|getBackupSchedule}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef GetBackupScheduleCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.BackupSchedule} [response] BackupSchedule
                             */
    
                            /**
                             * Calls GetBackupSchedule.
                             * @function getBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest} request GetBackupScheduleRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.GetBackupScheduleCallback} callback Node-style callback called with the error, if any, and BackupSchedule
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.getBackupSchedule = function getBackupSchedule(request, callback) {
                                return this.rpcCall(getBackupSchedule, $root.google.spanner.admin.database.v1.GetBackupScheduleRequest, $root.google.spanner.admin.database.v1.BackupSchedule, request, callback);
                            }, "name", { value: "GetBackupSchedule" });
    
                            /**
                             * Calls GetBackupSchedule.
                             * @function getBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IGetBackupScheduleRequest} request GetBackupScheduleRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.BackupSchedule>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|updateBackupSchedule}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef UpdateBackupScheduleCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.BackupSchedule} [response] BackupSchedule
                             */
    
                            /**
                             * Calls UpdateBackupSchedule.
                             * @function updateBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest} request UpdateBackupScheduleRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackupScheduleCallback} callback Node-style callback called with the error, if any, and BackupSchedule
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.updateBackupSchedule = function updateBackupSchedule(request, callback) {
                                return this.rpcCall(updateBackupSchedule, $root.google.spanner.admin.database.v1.UpdateBackupScheduleRequest, $root.google.spanner.admin.database.v1.BackupSchedule, request, callback);
                            }, "name", { value: "UpdateBackupSchedule" });
    
                            /**
                             * Calls UpdateBackupSchedule.
                             * @function updateBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IUpdateBackupScheduleRequest} request UpdateBackupScheduleRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.BackupSchedule>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|deleteBackupSchedule}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef DeleteBackupScheduleCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DeleteBackupSchedule.
                             * @function deleteBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest} request DeleteBackupScheduleRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackupScheduleCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.deleteBackupSchedule = function deleteBackupSchedule(request, callback) {
                                return this.rpcCall(deleteBackupSchedule, $root.google.spanner.admin.database.v1.DeleteBackupScheduleRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DeleteBackupSchedule" });
    
                            /**
                             * Calls DeleteBackupSchedule.
                             * @function deleteBackupSchedule
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IDeleteBackupScheduleRequest} request DeleteBackupScheduleRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|listBackupSchedules}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef ListBackupSchedulesCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.ListBackupSchedulesResponse} [response] ListBackupSchedulesResponse
                             */
    
                            /**
                             * Calls ListBackupSchedules.
                             * @function listBackupSchedules
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest} request ListBackupSchedulesRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.ListBackupSchedulesCallback} callback Node-style callback called with the error, if any, and ListBackupSchedulesResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.listBackupSchedules = function listBackupSchedules(request, callback) {
                                return this.rpcCall(listBackupSchedules, $root.google.spanner.admin.database.v1.ListBackupSchedulesRequest, $root.google.spanner.admin.database.v1.ListBackupSchedulesResponse, request, callback);
                            }, "name", { value: "ListBackupSchedules" });
    
                            /**
                             * Calls ListBackupSchedules.
                             * @function listBackupSchedules
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IListBackupSchedulesRequest} request ListBackupSchedulesRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.ListBackupSchedulesResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.database.v1.DatabaseAdmin|internalUpdateGraphOperation}.
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @typedef InternalUpdateGraphOperationCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} [response] InternalUpdateGraphOperationResponse
                             */
    
                            /**
                             * Calls InternalUpdateGraphOperation.
                             * @function internalUpdateGraphOperation
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest} request InternalUpdateGraphOperationRequest message or plain object
                             * @param {google.spanner.admin.database.v1.DatabaseAdmin.InternalUpdateGraphOperationCallback} callback Node-style callback called with the error, if any, and InternalUpdateGraphOperationResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(DatabaseAdmin.prototype.internalUpdateGraphOperation = function internalUpdateGraphOperation(request, callback) {
                                return this.rpcCall(internalUpdateGraphOperation, $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest, $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse, request, callback);
                            }, "name", { value: "InternalUpdateGraphOperation" });
    
                            /**
                             * Calls InternalUpdateGraphOperation.
                             * @function internalUpdateGraphOperation
                             * @memberof google.spanner.admin.database.v1.DatabaseAdmin
                             * @instance
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest} request InternalUpdateGraphOperationRequest message or plain object
                             * @returns {Promise<google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse>} Promise
                             * @variation 2
                             */
    
                            return DatabaseAdmin;
                        })();
    
                        v1.RestoreInfo = (function() {
    
                            /**
                             * Properties of a RestoreInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IRestoreInfo
                             * @property {google.spanner.admin.database.v1.RestoreSourceType|null} [sourceType] RestoreInfo sourceType
                             * @property {google.spanner.admin.database.v1.IBackupInfo|null} [backupInfo] RestoreInfo backupInfo
                             */
    
                            /**
                             * Constructs a new RestoreInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a RestoreInfo.
                             * @implements IRestoreInfo
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IRestoreInfo=} [properties] Properties to set
                             */
                            function RestoreInfo(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * RestoreInfo sourceType.
                             * @member {google.spanner.admin.database.v1.RestoreSourceType} sourceType
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @instance
                             */
                            RestoreInfo.prototype.sourceType = 0;
    
                            /**
                             * RestoreInfo backupInfo.
                             * @member {google.spanner.admin.database.v1.IBackupInfo|null|undefined} backupInfo
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @instance
                             */
                            RestoreInfo.prototype.backupInfo = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * RestoreInfo sourceInfo.
                             * @member {"backupInfo"|undefined} sourceInfo
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @instance
                             */
                            Object.defineProperty(RestoreInfo.prototype, "sourceInfo", {
                                get: $util.oneOfGetter($oneOfFields = ["backupInfo"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new RestoreInfo instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreInfo=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.RestoreInfo} RestoreInfo instance
                             */
                            RestoreInfo.create = function create(properties) {
                                return new RestoreInfo(properties);
                            };
    
                            /**
                             * Encodes the specified RestoreInfo message. Does not implicitly {@link google.spanner.admin.database.v1.RestoreInfo.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreInfo} message RestoreInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreInfo.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.sourceType != null && Object.hasOwnProperty.call(message, "sourceType"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.sourceType);
                                if (message.backupInfo != null && Object.hasOwnProperty.call(message, "backupInfo"))
                                    $root.google.spanner.admin.database.v1.BackupInfo.encode(message.backupInfo, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified RestoreInfo message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.RestoreInfo.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreInfo} message RestoreInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreInfo.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a RestoreInfo message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.RestoreInfo} RestoreInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreInfo.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.RestoreInfo();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.sourceType = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a RestoreInfo message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.RestoreInfo} RestoreInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreInfo.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a RestoreInfo message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            RestoreInfo.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.sourceType != null && message.hasOwnProperty("sourceType"))
                                    switch (message.sourceType) {
                                    default:
                                        return "sourceType: enum value expected";
                                    case 0:
                                    case 1:
                                        break;
                                    }
                                if (message.backupInfo != null && message.hasOwnProperty("backupInfo")) {
                                    properties.sourceInfo = 1;
                                    {
                                        var error = $root.google.spanner.admin.database.v1.BackupInfo.verify(message.backupInfo);
                                        if (error)
                                            return "backupInfo." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates a RestoreInfo message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.RestoreInfo} RestoreInfo
                             */
                            RestoreInfo.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.RestoreInfo)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.RestoreInfo();
                                switch (object.sourceType) {
                                default:
                                    if (typeof object.sourceType === "number") {
                                        message.sourceType = object.sourceType;
                                        break;
                                    }
                                    break;
                                case "TYPE_UNSPECIFIED":
                                case 0:
                                    message.sourceType = 0;
                                    break;
                                case "BACKUP":
                                case 1:
                                    message.sourceType = 1;
                                    break;
                                }
                                if (object.backupInfo != null) {
                                    if (typeof object.backupInfo !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreInfo.backupInfo: object expected");
                                    message.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.fromObject(object.backupInfo);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a RestoreInfo message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.RestoreInfo} message RestoreInfo
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            RestoreInfo.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.sourceType = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                                if (message.sourceType != null && message.hasOwnProperty("sourceType"))
                                    object.sourceType = options.enums === String ? $root.google.spanner.admin.database.v1.RestoreSourceType[message.sourceType] === undefined ? message.sourceType : $root.google.spanner.admin.database.v1.RestoreSourceType[message.sourceType] : message.sourceType;
                                if (message.backupInfo != null && message.hasOwnProperty("backupInfo")) {
                                    object.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.toObject(message.backupInfo, options);
                                    if (options.oneofs)
                                        object.sourceInfo = "backupInfo";
                                }
                                return object;
                            };
    
                            /**
                             * Converts this RestoreInfo to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            RestoreInfo.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for RestoreInfo
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.RestoreInfo
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            RestoreInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.RestoreInfo";
                            };
    
                            return RestoreInfo;
                        })();
    
                        v1.Database = (function() {
    
                            /**
                             * Properties of a Database.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDatabase
                             * @property {string|null} [name] Database name
                             * @property {google.spanner.admin.database.v1.Database.State|null} [state] Database state
                             * @property {google.protobuf.ITimestamp|null} [createTime] Database createTime
                             * @property {google.spanner.admin.database.v1.IRestoreInfo|null} [restoreInfo] Database restoreInfo
                             * @property {google.spanner.admin.database.v1.IEncryptionConfig|null} [encryptionConfig] Database encryptionConfig
                             * @property {Array.<google.spanner.admin.database.v1.IEncryptionInfo>|null} [encryptionInfo] Database encryptionInfo
                             * @property {string|null} [versionRetentionPeriod] Database versionRetentionPeriod
                             * @property {google.protobuf.ITimestamp|null} [earliestVersionTime] Database earliestVersionTime
                             * @property {string|null} [defaultLeader] Database defaultLeader
                             * @property {google.spanner.admin.database.v1.DatabaseDialect|null} [databaseDialect] Database databaseDialect
                             * @property {boolean|null} [enableDropProtection] Database enableDropProtection
                             * @property {boolean|null} [reconciling] Database reconciling
                             */
    
                            /**
                             * Constructs a new Database.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a Database.
                             * @implements IDatabase
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDatabase=} [properties] Properties to set
                             */
                            function Database(properties) {
                                this.encryptionInfo = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Database name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.name = "";
    
                            /**
                             * Database state.
                             * @member {google.spanner.admin.database.v1.Database.State} state
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.state = 0;
    
                            /**
                             * Database createTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} createTime
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.createTime = null;
    
                            /**
                             * Database restoreInfo.
                             * @member {google.spanner.admin.database.v1.IRestoreInfo|null|undefined} restoreInfo
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.restoreInfo = null;
    
                            /**
                             * Database encryptionConfig.
                             * @member {google.spanner.admin.database.v1.IEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.encryptionConfig = null;
    
                            /**
                             * Database encryptionInfo.
                             * @member {Array.<google.spanner.admin.database.v1.IEncryptionInfo>} encryptionInfo
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.encryptionInfo = $util.emptyArray;
    
                            /**
                             * Database versionRetentionPeriod.
                             * @member {string} versionRetentionPeriod
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.versionRetentionPeriod = "";
    
                            /**
                             * Database earliestVersionTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} earliestVersionTime
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.earliestVersionTime = null;
    
                            /**
                             * Database defaultLeader.
                             * @member {string} defaultLeader
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.defaultLeader = "";
    
                            /**
                             * Database databaseDialect.
                             * @member {google.spanner.admin.database.v1.DatabaseDialect} databaseDialect
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.databaseDialect = 0;
    
                            /**
                             * Database enableDropProtection.
                             * @member {boolean} enableDropProtection
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.enableDropProtection = false;
    
                            /**
                             * Database reconciling.
                             * @member {boolean} reconciling
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             */
                            Database.prototype.reconciling = false;
    
                            /**
                             * Creates a new Database instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabase=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.Database} Database instance
                             */
                            Database.create = function create(properties) {
                                return new Database(properties);
                            };
    
                            /**
                             * Encodes the specified Database message. Does not implicitly {@link google.spanner.admin.database.v1.Database.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabase} message Database message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Database.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.state);
                                if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                                    $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.restoreInfo != null && Object.hasOwnProperty.call(message, "restoreInfo"))
                                    $root.google.spanner.admin.database.v1.RestoreInfo.encode(message.restoreInfo, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.EncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                if (message.versionRetentionPeriod != null && Object.hasOwnProperty.call(message, "versionRetentionPeriod"))
                                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.versionRetentionPeriod);
                                if (message.earliestVersionTime != null && Object.hasOwnProperty.call(message, "earliestVersionTime"))
                                    $root.google.protobuf.Timestamp.encode(message.earliestVersionTime, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                                if (message.encryptionInfo != null && message.encryptionInfo.length)
                                    for (var i = 0; i < message.encryptionInfo.length; ++i)
                                        $root.google.spanner.admin.database.v1.EncryptionInfo.encode(message.encryptionInfo[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                                if (message.defaultLeader != null && Object.hasOwnProperty.call(message, "defaultLeader"))
                                    writer.uint32(/* id 9, wireType 2 =*/74).string(message.defaultLeader);
                                if (message.databaseDialect != null && Object.hasOwnProperty.call(message, "databaseDialect"))
                                    writer.uint32(/* id 10, wireType 0 =*/80).int32(message.databaseDialect);
                                if (message.enableDropProtection != null && Object.hasOwnProperty.call(message, "enableDropProtection"))
                                    writer.uint32(/* id 11, wireType 0 =*/88).bool(message.enableDropProtection);
                                if (message.reconciling != null && Object.hasOwnProperty.call(message, "reconciling"))
                                    writer.uint32(/* id 12, wireType 0 =*/96).bool(message.reconciling);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Database message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.Database.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabase} message Database message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Database.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Database message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.Database} Database
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Database.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.Database();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.state = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.restoreInfo = $root.google.spanner.admin.database.v1.RestoreInfo.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 8: {
                                            if (!(message.encryptionInfo && message.encryptionInfo.length))
                                                message.encryptionInfo = [];
                                            message.encryptionInfo.push($root.google.spanner.admin.database.v1.EncryptionInfo.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 6: {
                                            message.versionRetentionPeriod = reader.string();
                                            break;
                                        }
                                    case 7: {
                                            message.earliestVersionTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 9: {
                                            message.defaultLeader = reader.string();
                                            break;
                                        }
                                    case 10: {
                                            message.databaseDialect = reader.int32();
                                            break;
                                        }
                                    case 11: {
                                            message.enableDropProtection = reader.bool();
                                            break;
                                        }
                                    case 12: {
                                            message.reconciling = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Database message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.Database} Database
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Database.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Database message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Database.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.state != null && message.hasOwnProperty("state"))
                                    switch (message.state) {
                                    default:
                                        return "state: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.createTime != null && message.hasOwnProperty("createTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                                    if (error)
                                        return "createTime." + error;
                                }
                                if (message.restoreInfo != null && message.hasOwnProperty("restoreInfo")) {
                                    var error = $root.google.spanner.admin.database.v1.RestoreInfo.verify(message.restoreInfo);
                                    if (error)
                                        return "restoreInfo." + error;
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.EncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                if (message.encryptionInfo != null && message.hasOwnProperty("encryptionInfo")) {
                                    if (!Array.isArray(message.encryptionInfo))
                                        return "encryptionInfo: array expected";
                                    for (var i = 0; i < message.encryptionInfo.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.EncryptionInfo.verify(message.encryptionInfo[i]);
                                        if (error)
                                            return "encryptionInfo." + error;
                                    }
                                }
                                if (message.versionRetentionPeriod != null && message.hasOwnProperty("versionRetentionPeriod"))
                                    if (!$util.isString(message.versionRetentionPeriod))
                                        return "versionRetentionPeriod: string expected";
                                if (message.earliestVersionTime != null && message.hasOwnProperty("earliestVersionTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.earliestVersionTime);
                                    if (error)
                                        return "earliestVersionTime." + error;
                                }
                                if (message.defaultLeader != null && message.hasOwnProperty("defaultLeader"))
                                    if (!$util.isString(message.defaultLeader))
                                        return "defaultLeader: string expected";
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    switch (message.databaseDialect) {
                                    default:
                                        return "databaseDialect: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.enableDropProtection != null && message.hasOwnProperty("enableDropProtection"))
                                    if (typeof message.enableDropProtection !== "boolean")
                                        return "enableDropProtection: boolean expected";
                                if (message.reconciling != null && message.hasOwnProperty("reconciling"))
                                    if (typeof message.reconciling !== "boolean")
                                        return "reconciling: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates a Database message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.Database} Database
                             */
                            Database.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.Database)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.Database();
                                if (object.name != null)
                                    message.name = String(object.name);
                                switch (object.state) {
                                default:
                                    if (typeof object.state === "number") {
                                        message.state = object.state;
                                        break;
                                    }
                                    break;
                                case "STATE_UNSPECIFIED":
                                case 0:
                                    message.state = 0;
                                    break;
                                case "CREATING":
                                case 1:
                                    message.state = 1;
                                    break;
                                case "READY":
                                case 2:
                                    message.state = 2;
                                    break;
                                case "READY_OPTIMIZING":
                                case 3:
                                    message.state = 3;
                                    break;
                                }
                                if (object.createTime != null) {
                                    if (typeof object.createTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Database.createTime: object expected");
                                    message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                                }
                                if (object.restoreInfo != null) {
                                    if (typeof object.restoreInfo !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Database.restoreInfo: object expected");
                                    message.restoreInfo = $root.google.spanner.admin.database.v1.RestoreInfo.fromObject(object.restoreInfo);
                                }
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Database.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                if (object.encryptionInfo) {
                                    if (!Array.isArray(object.encryptionInfo))
                                        throw TypeError(".google.spanner.admin.database.v1.Database.encryptionInfo: array expected");
                                    message.encryptionInfo = [];
                                    for (var i = 0; i < object.encryptionInfo.length; ++i) {
                                        if (typeof object.encryptionInfo[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.Database.encryptionInfo: object expected");
                                        message.encryptionInfo[i] = $root.google.spanner.admin.database.v1.EncryptionInfo.fromObject(object.encryptionInfo[i]);
                                    }
                                }
                                if (object.versionRetentionPeriod != null)
                                    message.versionRetentionPeriod = String(object.versionRetentionPeriod);
                                if (object.earliestVersionTime != null) {
                                    if (typeof object.earliestVersionTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.Database.earliestVersionTime: object expected");
                                    message.earliestVersionTime = $root.google.protobuf.Timestamp.fromObject(object.earliestVersionTime);
                                }
                                if (object.defaultLeader != null)
                                    message.defaultLeader = String(object.defaultLeader);
                                switch (object.databaseDialect) {
                                default:
                                    if (typeof object.databaseDialect === "number") {
                                        message.databaseDialect = object.databaseDialect;
                                        break;
                                    }
                                    break;
                                case "DATABASE_DIALECT_UNSPECIFIED":
                                case 0:
                                    message.databaseDialect = 0;
                                    break;
                                case "GOOGLE_STANDARD_SQL":
                                case 1:
                                    message.databaseDialect = 1;
                                    break;
                                case "POSTGRESQL":
                                case 2:
                                    message.databaseDialect = 2;
                                    break;
                                }
                                if (object.enableDropProtection != null)
                                    message.enableDropProtection = Boolean(object.enableDropProtection);
                                if (object.reconciling != null)
                                    message.reconciling = Boolean(object.reconciling);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Database message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {google.spanner.admin.database.v1.Database} message Database
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Database.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.encryptionInfo = [];
                                if (options.defaults) {
                                    object.name = "";
                                    object.state = options.enums === String ? "STATE_UNSPECIFIED" : 0;
                                    object.createTime = null;
                                    object.restoreInfo = null;
                                    object.encryptionConfig = null;
                                    object.versionRetentionPeriod = "";
                                    object.earliestVersionTime = null;
                                    object.defaultLeader = "";
                                    object.databaseDialect = options.enums === String ? "DATABASE_DIALECT_UNSPECIFIED" : 0;
                                    object.enableDropProtection = false;
                                    object.reconciling = false;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.state != null && message.hasOwnProperty("state"))
                                    object.state = options.enums === String ? $root.google.spanner.admin.database.v1.Database.State[message.state] === undefined ? message.state : $root.google.spanner.admin.database.v1.Database.State[message.state] : message.state;
                                if (message.createTime != null && message.hasOwnProperty("createTime"))
                                    object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                                if (message.restoreInfo != null && message.hasOwnProperty("restoreInfo"))
                                    object.restoreInfo = $root.google.spanner.admin.database.v1.RestoreInfo.toObject(message.restoreInfo, options);
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.toObject(message.encryptionConfig, options);
                                if (message.versionRetentionPeriod != null && message.hasOwnProperty("versionRetentionPeriod"))
                                    object.versionRetentionPeriod = message.versionRetentionPeriod;
                                if (message.earliestVersionTime != null && message.hasOwnProperty("earliestVersionTime"))
                                    object.earliestVersionTime = $root.google.protobuf.Timestamp.toObject(message.earliestVersionTime, options);
                                if (message.encryptionInfo && message.encryptionInfo.length) {
                                    object.encryptionInfo = [];
                                    for (var j = 0; j < message.encryptionInfo.length; ++j)
                                        object.encryptionInfo[j] = $root.google.spanner.admin.database.v1.EncryptionInfo.toObject(message.encryptionInfo[j], options);
                                }
                                if (message.defaultLeader != null && message.hasOwnProperty("defaultLeader"))
                                    object.defaultLeader = message.defaultLeader;
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    object.databaseDialect = options.enums === String ? $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] === undefined ? message.databaseDialect : $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] : message.databaseDialect;
                                if (message.enableDropProtection != null && message.hasOwnProperty("enableDropProtection"))
                                    object.enableDropProtection = message.enableDropProtection;
                                if (message.reconciling != null && message.hasOwnProperty("reconciling"))
                                    object.reconciling = message.reconciling;
                                return object;
                            };
    
                            /**
                             * Converts this Database to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.Database
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Database.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Database
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.Database
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Database.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.Database";
                            };
    
                            /**
                             * State enum.
                             * @name google.spanner.admin.database.v1.Database.State
                             * @enum {number}
                             * @property {number} STATE_UNSPECIFIED=0 STATE_UNSPECIFIED value
                             * @property {number} CREATING=1 CREATING value
                             * @property {number} READY=2 READY value
                             * @property {number} READY_OPTIMIZING=3 READY_OPTIMIZING value
                             */
                            Database.State = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "STATE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "CREATING"] = 1;
                                values[valuesById[2] = "READY"] = 2;
                                values[valuesById[3] = "READY_OPTIMIZING"] = 3;
                                return values;
                            })();
    
                            return Database;
                        })();
    
                        v1.ListDatabasesRequest = (function() {
    
                            /**
                             * Properties of a ListDatabasesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabasesRequest
                             * @property {string|null} [parent] ListDatabasesRequest parent
                             * @property {number|null} [pageSize] ListDatabasesRequest pageSize
                             * @property {string|null} [pageToken] ListDatabasesRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListDatabasesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabasesRequest.
                             * @implements IListDatabasesRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest=} [properties] Properties to set
                             */
                            function ListDatabasesRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabasesRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @instance
                             */
                            ListDatabasesRequest.prototype.parent = "";
    
                            /**
                             * ListDatabasesRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @instance
                             */
                            ListDatabasesRequest.prototype.pageSize = 0;
    
                            /**
                             * ListDatabasesRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @instance
                             */
                            ListDatabasesRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListDatabasesRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabasesRequest} ListDatabasesRequest instance
                             */
                            ListDatabasesRequest.create = function create(properties) {
                                return new ListDatabasesRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabasesRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabasesRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest} message ListDatabasesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabasesRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabasesRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabasesRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesRequest} message ListDatabasesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabasesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabasesRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabasesRequest} ListDatabasesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabasesRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabasesRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabasesRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabasesRequest} ListDatabasesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabasesRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabasesRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabasesRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabasesRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabasesRequest} ListDatabasesRequest
                             */
                            ListDatabasesRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabasesRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabasesRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabasesRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabasesRequest} message ListDatabasesRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabasesRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabasesRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabasesRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabasesRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabasesRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabasesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabasesRequest";
                            };
    
                            return ListDatabasesRequest;
                        })();
    
                        v1.ListDatabasesResponse = (function() {
    
                            /**
                             * Properties of a ListDatabasesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabasesResponse
                             * @property {Array.<google.spanner.admin.database.v1.IDatabase>|null} [databases] ListDatabasesResponse databases
                             * @property {string|null} [nextPageToken] ListDatabasesResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListDatabasesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabasesResponse.
                             * @implements IListDatabasesResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabasesResponse=} [properties] Properties to set
                             */
                            function ListDatabasesResponse(properties) {
                                this.databases = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabasesResponse databases.
                             * @member {Array.<google.spanner.admin.database.v1.IDatabase>} databases
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @instance
                             */
                            ListDatabasesResponse.prototype.databases = $util.emptyArray;
    
                            /**
                             * ListDatabasesResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @instance
                             */
                            ListDatabasesResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListDatabasesResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabasesResponse} ListDatabasesResponse instance
                             */
                            ListDatabasesResponse.create = function create(properties) {
                                return new ListDatabasesResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabasesResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabasesResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesResponse} message ListDatabasesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabasesResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.databases != null && message.databases.length)
                                    for (var i = 0; i < message.databases.length; ++i)
                                        $root.google.spanner.admin.database.v1.Database.encode(message.databases[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabasesResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabasesResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabasesResponse} message ListDatabasesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabasesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabasesResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabasesResponse} ListDatabasesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabasesResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabasesResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.databases && message.databases.length))
                                                message.databases = [];
                                            message.databases.push($root.google.spanner.admin.database.v1.Database.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabasesResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabasesResponse} ListDatabasesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabasesResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabasesResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabasesResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.databases != null && message.hasOwnProperty("databases")) {
                                    if (!Array.isArray(message.databases))
                                        return "databases: array expected";
                                    for (var i = 0; i < message.databases.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.Database.verify(message.databases[i]);
                                        if (error)
                                            return "databases." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabasesResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabasesResponse} ListDatabasesResponse
                             */
                            ListDatabasesResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabasesResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabasesResponse();
                                if (object.databases) {
                                    if (!Array.isArray(object.databases))
                                        throw TypeError(".google.spanner.admin.database.v1.ListDatabasesResponse.databases: array expected");
                                    message.databases = [];
                                    for (var i = 0; i < object.databases.length; ++i) {
                                        if (typeof object.databases[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListDatabasesResponse.databases: object expected");
                                        message.databases[i] = $root.google.spanner.admin.database.v1.Database.fromObject(object.databases[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabasesResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabasesResponse} message ListDatabasesResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabasesResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.databases = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.databases && message.databases.length) {
                                    object.databases = [];
                                    for (var j = 0; j < message.databases.length; ++j)
                                        object.databases[j] = $root.google.spanner.admin.database.v1.Database.toObject(message.databases[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabasesResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabasesResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabasesResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabasesResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabasesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabasesResponse";
                            };
    
                            return ListDatabasesResponse;
                        })();
    
                        v1.CreateDatabaseRequest = (function() {
    
                            /**
                             * Properties of a CreateDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateDatabaseRequest
                             * @property {string|null} [parent] CreateDatabaseRequest parent
                             * @property {string|null} [createStatement] CreateDatabaseRequest createStatement
                             * @property {Array.<string>|null} [extraStatements] CreateDatabaseRequest extraStatements
                             * @property {google.spanner.admin.database.v1.IEncryptionConfig|null} [encryptionConfig] CreateDatabaseRequest encryptionConfig
                             * @property {google.spanner.admin.database.v1.DatabaseDialect|null} [databaseDialect] CreateDatabaseRequest databaseDialect
                             * @property {Uint8Array|null} [protoDescriptors] CreateDatabaseRequest protoDescriptors
                             */
    
                            /**
                             * Constructs a new CreateDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateDatabaseRequest.
                             * @implements ICreateDatabaseRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest=} [properties] Properties to set
                             */
                            function CreateDatabaseRequest(properties) {
                                this.extraStatements = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateDatabaseRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.parent = "";
    
                            /**
                             * CreateDatabaseRequest createStatement.
                             * @member {string} createStatement
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.createStatement = "";
    
                            /**
                             * CreateDatabaseRequest extraStatements.
                             * @member {Array.<string>} extraStatements
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.extraStatements = $util.emptyArray;
    
                            /**
                             * CreateDatabaseRequest encryptionConfig.
                             * @member {google.spanner.admin.database.v1.IEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.encryptionConfig = null;
    
                            /**
                             * CreateDatabaseRequest databaseDialect.
                             * @member {google.spanner.admin.database.v1.DatabaseDialect} databaseDialect
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.databaseDialect = 0;
    
                            /**
                             * CreateDatabaseRequest protoDescriptors.
                             * @member {Uint8Array} protoDescriptors
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             */
                            CreateDatabaseRequest.prototype.protoDescriptors = $util.newBuffer([]);
    
                            /**
                             * Creates a new CreateDatabaseRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseRequest} CreateDatabaseRequest instance
                             */
                            CreateDatabaseRequest.create = function create(properties) {
                                return new CreateDatabaseRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateDatabaseRequest message. Does not implicitly {@link google.spanner.admin.database.v1.CreateDatabaseRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest} message CreateDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateDatabaseRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.createStatement != null && Object.hasOwnProperty.call(message, "createStatement"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.createStatement);
                                if (message.extraStatements != null && message.extraStatements.length)
                                    for (var i = 0; i < message.extraStatements.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.extraStatements[i]);
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.EncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.databaseDialect != null && Object.hasOwnProperty.call(message, "databaseDialect"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.databaseDialect);
                                if (message.protoDescriptors != null && Object.hasOwnProperty.call(message, "protoDescriptors"))
                                    writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.protoDescriptors);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateDatabaseRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateDatabaseRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseRequest} message CreateDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateDatabaseRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateDatabaseRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseRequest} CreateDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateDatabaseRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateDatabaseRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.createStatement = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.extraStatements && message.extraStatements.length))
                                                message.extraStatements = [];
                                            message.extraStatements.push(reader.string());
                                            break;
                                        }
                                    case 4: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.databaseDialect = reader.int32();
                                            break;
                                        }
                                    case 6: {
                                            message.protoDescriptors = reader.bytes();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateDatabaseRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseRequest} CreateDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateDatabaseRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateDatabaseRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateDatabaseRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.createStatement != null && message.hasOwnProperty("createStatement"))
                                    if (!$util.isString(message.createStatement))
                                        return "createStatement: string expected";
                                if (message.extraStatements != null && message.hasOwnProperty("extraStatements")) {
                                    if (!Array.isArray(message.extraStatements))
                                        return "extraStatements: array expected";
                                    for (var i = 0; i < message.extraStatements.length; ++i)
                                        if (!$util.isString(message.extraStatements[i]))
                                            return "extraStatements: string[] expected";
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.EncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    switch (message.databaseDialect) {
                                    default:
                                        return "databaseDialect: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    if (!(message.protoDescriptors && typeof message.protoDescriptors.length === "number" || $util.isString(message.protoDescriptors)))
                                        return "protoDescriptors: buffer expected";
                                return null;
                            };
    
                            /**
                             * Creates a CreateDatabaseRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseRequest} CreateDatabaseRequest
                             */
                            CreateDatabaseRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateDatabaseRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateDatabaseRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.createStatement != null)
                                    message.createStatement = String(object.createStatement);
                                if (object.extraStatements) {
                                    if (!Array.isArray(object.extraStatements))
                                        throw TypeError(".google.spanner.admin.database.v1.CreateDatabaseRequest.extraStatements: array expected");
                                    message.extraStatements = [];
                                    for (var i = 0; i < object.extraStatements.length; ++i)
                                        message.extraStatements[i] = String(object.extraStatements[i]);
                                }
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.CreateDatabaseRequest.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                switch (object.databaseDialect) {
                                default:
                                    if (typeof object.databaseDialect === "number") {
                                        message.databaseDialect = object.databaseDialect;
                                        break;
                                    }
                                    break;
                                case "DATABASE_DIALECT_UNSPECIFIED":
                                case 0:
                                    message.databaseDialect = 0;
                                    break;
                                case "GOOGLE_STANDARD_SQL":
                                case 1:
                                    message.databaseDialect = 1;
                                    break;
                                case "POSTGRESQL":
                                case 2:
                                    message.databaseDialect = 2;
                                    break;
                                }
                                if (object.protoDescriptors != null)
                                    if (typeof object.protoDescriptors === "string")
                                        $util.base64.decode(object.protoDescriptors, message.protoDescriptors = $util.newBuffer($util.base64.length(object.protoDescriptors)), 0);
                                    else if (object.protoDescriptors.length >= 0)
                                        message.protoDescriptors = object.protoDescriptors;
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateDatabaseRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateDatabaseRequest} message CreateDatabaseRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateDatabaseRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.extraStatements = [];
                                if (options.defaults) {
                                    object.parent = "";
                                    object.createStatement = "";
                                    object.encryptionConfig = null;
                                    object.databaseDialect = options.enums === String ? "DATABASE_DIALECT_UNSPECIFIED" : 0;
                                    if (options.bytes === String)
                                        object.protoDescriptors = "";
                                    else {
                                        object.protoDescriptors = [];
                                        if (options.bytes !== Array)
                                            object.protoDescriptors = $util.newBuffer(object.protoDescriptors);
                                    }
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.createStatement != null && message.hasOwnProperty("createStatement"))
                                    object.createStatement = message.createStatement;
                                if (message.extraStatements && message.extraStatements.length) {
                                    object.extraStatements = [];
                                    for (var j = 0; j < message.extraStatements.length; ++j)
                                        object.extraStatements[j] = message.extraStatements[j];
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.toObject(message.encryptionConfig, options);
                                if (message.databaseDialect != null && message.hasOwnProperty("databaseDialect"))
                                    object.databaseDialect = options.enums === String ? $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] === undefined ? message.databaseDialect : $root.google.spanner.admin.database.v1.DatabaseDialect[message.databaseDialect] : message.databaseDialect;
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    object.protoDescriptors = options.bytes === String ? $util.base64.encode(message.protoDescriptors, 0, message.protoDescriptors.length) : options.bytes === Array ? Array.prototype.slice.call(message.protoDescriptors) : message.protoDescriptors;
                                return object;
                            };
    
                            /**
                             * Converts this CreateDatabaseRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateDatabaseRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateDatabaseRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateDatabaseRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateDatabaseRequest";
                            };
    
                            return CreateDatabaseRequest;
                        })();
    
                        v1.CreateDatabaseMetadata = (function() {
    
                            /**
                             * Properties of a CreateDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ICreateDatabaseMetadata
                             * @property {string|null} [database] CreateDatabaseMetadata database
                             */
    
                            /**
                             * Constructs a new CreateDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a CreateDatabaseMetadata.
                             * @implements ICreateDatabaseMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseMetadata=} [properties] Properties to set
                             */
                            function CreateDatabaseMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateDatabaseMetadata database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @instance
                             */
                            CreateDatabaseMetadata.prototype.database = "";
    
                            /**
                             * Creates a new CreateDatabaseMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseMetadata} CreateDatabaseMetadata instance
                             */
                            CreateDatabaseMetadata.create = function create(properties) {
                                return new CreateDatabaseMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CreateDatabaseMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.CreateDatabaseMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseMetadata} message CreateDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateDatabaseMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateDatabaseMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.CreateDatabaseMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.ICreateDatabaseMetadata} message CreateDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateDatabaseMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateDatabaseMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseMetadata} CreateDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateDatabaseMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.CreateDatabaseMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateDatabaseMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseMetadata} CreateDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateDatabaseMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateDatabaseMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateDatabaseMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a CreateDatabaseMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.CreateDatabaseMetadata} CreateDatabaseMetadata
                             */
                            CreateDatabaseMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.CreateDatabaseMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.CreateDatabaseMetadata();
                                if (object.database != null)
                                    message.database = String(object.database);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateDatabaseMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.CreateDatabaseMetadata} message CreateDatabaseMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateDatabaseMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.database = "";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                return object;
                            };
    
                            /**
                             * Converts this CreateDatabaseMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateDatabaseMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateDatabaseMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.CreateDatabaseMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateDatabaseMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.CreateDatabaseMetadata";
                            };
    
                            return CreateDatabaseMetadata;
                        })();
    
                        v1.GetDatabaseRequest = (function() {
    
                            /**
                             * Properties of a GetDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IGetDatabaseRequest
                             * @property {string|null} [name] GetDatabaseRequest name
                             */
    
                            /**
                             * Constructs a new GetDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a GetDatabaseRequest.
                             * @implements IGetDatabaseRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest=} [properties] Properties to set
                             */
                            function GetDatabaseRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetDatabaseRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @instance
                             */
                            GetDatabaseRequest.prototype.name = "";
    
                            /**
                             * Creates a new GetDatabaseRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.GetDatabaseRequest} GetDatabaseRequest instance
                             */
                            GetDatabaseRequest.create = function create(properties) {
                                return new GetDatabaseRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetDatabaseRequest message. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest} message GetDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetDatabaseRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseRequest} message GetDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetDatabaseRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.GetDatabaseRequest} GetDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.GetDatabaseRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetDatabaseRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.GetDatabaseRequest} GetDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetDatabaseRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetDatabaseRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetDatabaseRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.GetDatabaseRequest} GetDatabaseRequest
                             */
                            GetDatabaseRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.GetDatabaseRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.GetDatabaseRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetDatabaseRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.GetDatabaseRequest} message GetDatabaseRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetDatabaseRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this GetDatabaseRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetDatabaseRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetDatabaseRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.GetDatabaseRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetDatabaseRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.GetDatabaseRequest";
                            };
    
                            return GetDatabaseRequest;
                        })();
    
                        v1.UpdateDatabaseRequest = (function() {
    
                            /**
                             * Properties of an UpdateDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateDatabaseRequest
                             * @property {google.spanner.admin.database.v1.IDatabase|null} [database] UpdateDatabaseRequest database
                             * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateDatabaseRequest updateMask
                             */
    
                            /**
                             * Constructs a new UpdateDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateDatabaseRequest.
                             * @implements IUpdateDatabaseRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest=} [properties] Properties to set
                             */
                            function UpdateDatabaseRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateDatabaseRequest database.
                             * @member {google.spanner.admin.database.v1.IDatabase|null|undefined} database
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @instance
                             */
                            UpdateDatabaseRequest.prototype.database = null;
    
                            /**
                             * UpdateDatabaseRequest updateMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @instance
                             */
                            UpdateDatabaseRequest.prototype.updateMask = null;
    
                            /**
                             * Creates a new UpdateDatabaseRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseRequest} UpdateDatabaseRequest instance
                             */
                            UpdateDatabaseRequest.create = function create(properties) {
                                return new UpdateDatabaseRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseRequest message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest} message UpdateDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    $root.google.spanner.admin.database.v1.Database.encode(message.database, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                                    $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseRequest} message UpdateDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateDatabaseRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseRequest} UpdateDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateDatabaseRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = $root.google.spanner.admin.database.v1.Database.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateDatabaseRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseRequest} UpdateDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateDatabaseRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateDatabaseRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database")) {
                                    var error = $root.google.spanner.admin.database.v1.Database.verify(message.database);
                                    if (error)
                                        return "database." + error;
                                }
                                if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                                    if (error)
                                        return "updateMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateDatabaseRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseRequest} UpdateDatabaseRequest
                             */
                            UpdateDatabaseRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateDatabaseRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateDatabaseRequest();
                                if (object.database != null) {
                                    if (typeof object.database !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseRequest.database: object expected");
                                    message.database = $root.google.spanner.admin.database.v1.Database.fromObject(object.database);
                                }
                                if (object.updateMask != null) {
                                    if (typeof object.updateMask !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseRequest.updateMask: object expected");
                                    message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateDatabaseRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateDatabaseRequest} message UpdateDatabaseRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateDatabaseRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.database = null;
                                    object.updateMask = null;
                                }
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = $root.google.spanner.admin.database.v1.Database.toObject(message.database, options);
                                if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                                    object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateDatabaseRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateDatabaseRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateDatabaseRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateDatabaseRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateDatabaseRequest";
                            };
    
                            return UpdateDatabaseRequest;
                        })();
    
                        v1.UpdateDatabaseMetadata = (function() {
    
                            /**
                             * Properties of an UpdateDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateDatabaseMetadata
                             * @property {google.spanner.admin.database.v1.IUpdateDatabaseRequest|null} [request] UpdateDatabaseMetadata request
                             * @property {google.spanner.admin.database.v1.IOperationProgress|null} [progress] UpdateDatabaseMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] UpdateDatabaseMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new UpdateDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateDatabaseMetadata.
                             * @implements IUpdateDatabaseMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseMetadata=} [properties] Properties to set
                             */
                            function UpdateDatabaseMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateDatabaseMetadata request.
                             * @member {google.spanner.admin.database.v1.IUpdateDatabaseRequest|null|undefined} request
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @instance
                             */
                            UpdateDatabaseMetadata.prototype.request = null;
    
                            /**
                             * UpdateDatabaseMetadata progress.
                             * @member {google.spanner.admin.database.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @instance
                             */
                            UpdateDatabaseMetadata.prototype.progress = null;
    
                            /**
                             * UpdateDatabaseMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @instance
                             */
                            UpdateDatabaseMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new UpdateDatabaseMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseMetadata} UpdateDatabaseMetadata instance
                             */
                            UpdateDatabaseMetadata.create = function create(properties) {
                                return new UpdateDatabaseMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseMetadata} message UpdateDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.request != null && Object.hasOwnProperty.call(message, "request"))
                                    $root.google.spanner.admin.database.v1.UpdateDatabaseRequest.encode(message.request, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseMetadata} message UpdateDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateDatabaseMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseMetadata} UpdateDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateDatabaseMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.request = $root.google.spanner.admin.database.v1.UpdateDatabaseRequest.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.progress = $root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateDatabaseMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseMetadata} UpdateDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateDatabaseMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateDatabaseMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.request != null && message.hasOwnProperty("request")) {
                                    var error = $root.google.spanner.admin.database.v1.UpdateDatabaseRequest.verify(message.request);
                                    if (error)
                                        return "request." + error;
                                }
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateDatabaseMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseMetadata} UpdateDatabaseMetadata
                             */
                            UpdateDatabaseMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateDatabaseMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateDatabaseMetadata();
                                if (object.request != null) {
                                    if (typeof object.request !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseMetadata.request: object expected");
                                    message.request = $root.google.spanner.admin.database.v1.UpdateDatabaseRequest.fromObject(object.request);
                                }
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateDatabaseMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateDatabaseMetadata} message UpdateDatabaseMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateDatabaseMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.request = null;
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.request != null && message.hasOwnProperty("request"))
                                    object.request = $root.google.spanner.admin.database.v1.UpdateDatabaseRequest.toObject(message.request, options);
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateDatabaseMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateDatabaseMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateDatabaseMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateDatabaseMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateDatabaseMetadata";
                            };
    
                            return UpdateDatabaseMetadata;
                        })();
    
                        v1.UpdateDatabaseDdlRequest = (function() {
    
                            /**
                             * Properties of an UpdateDatabaseDdlRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateDatabaseDdlRequest
                             * @property {string|null} [database] UpdateDatabaseDdlRequest database
                             * @property {Array.<string>|null} [statements] UpdateDatabaseDdlRequest statements
                             * @property {string|null} [operationId] UpdateDatabaseDdlRequest operationId
                             * @property {Uint8Array|null} [protoDescriptors] UpdateDatabaseDdlRequest protoDescriptors
                             * @property {boolean|null} [throughputMode] UpdateDatabaseDdlRequest throughputMode
                             */
    
                            /**
                             * Constructs a new UpdateDatabaseDdlRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateDatabaseDdlRequest.
                             * @implements IUpdateDatabaseDdlRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest=} [properties] Properties to set
                             */
                            function UpdateDatabaseDdlRequest(properties) {
                                this.statements = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateDatabaseDdlRequest database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             */
                            UpdateDatabaseDdlRequest.prototype.database = "";
    
                            /**
                             * UpdateDatabaseDdlRequest statements.
                             * @member {Array.<string>} statements
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             */
                            UpdateDatabaseDdlRequest.prototype.statements = $util.emptyArray;
    
                            /**
                             * UpdateDatabaseDdlRequest operationId.
                             * @member {string} operationId
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             */
                            UpdateDatabaseDdlRequest.prototype.operationId = "";
    
                            /**
                             * UpdateDatabaseDdlRequest protoDescriptors.
                             * @member {Uint8Array} protoDescriptors
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             */
                            UpdateDatabaseDdlRequest.prototype.protoDescriptors = $util.newBuffer([]);
    
                            /**
                             * UpdateDatabaseDdlRequest throughputMode.
                             * @member {boolean} throughputMode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             */
                            UpdateDatabaseDdlRequest.prototype.throughputMode = false;
    
                            /**
                             * Creates a new UpdateDatabaseDdlRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlRequest} UpdateDatabaseDdlRequest instance
                             */
                            UpdateDatabaseDdlRequest.create = function create(properties) {
                                return new UpdateDatabaseDdlRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseDdlRequest message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest} message UpdateDatabaseDdlRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseDdlRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                if (message.statements != null && message.statements.length)
                                    for (var i = 0; i < message.statements.length; ++i)
                                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.statements[i]);
                                if (message.operationId != null && Object.hasOwnProperty.call(message, "operationId"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.operationId);
                                if (message.protoDescriptors != null && Object.hasOwnProperty.call(message, "protoDescriptors"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.protoDescriptors);
                                if (message.throughputMode != null && Object.hasOwnProperty.call(message, "throughputMode"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).bool(message.throughputMode);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseDdlRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlRequest} message UpdateDatabaseDdlRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseDdlRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateDatabaseDdlRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlRequest} UpdateDatabaseDdlRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseDdlRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.statements && message.statements.length))
                                                message.statements = [];
                                            message.statements.push(reader.string());
                                            break;
                                        }
                                    case 3: {
                                            message.operationId = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.protoDescriptors = reader.bytes();
                                            break;
                                        }
                                    case 5: {
                                            message.throughputMode = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateDatabaseDdlRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlRequest} UpdateDatabaseDdlRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseDdlRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateDatabaseDdlRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateDatabaseDdlRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.statements != null && message.hasOwnProperty("statements")) {
                                    if (!Array.isArray(message.statements))
                                        return "statements: array expected";
                                    for (var i = 0; i < message.statements.length; ++i)
                                        if (!$util.isString(message.statements[i]))
                                            return "statements: string[] expected";
                                }
                                if (message.operationId != null && message.hasOwnProperty("operationId"))
                                    if (!$util.isString(message.operationId))
                                        return "operationId: string expected";
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    if (!(message.protoDescriptors && typeof message.protoDescriptors.length === "number" || $util.isString(message.protoDescriptors)))
                                        return "protoDescriptors: buffer expected";
                                if (message.throughputMode != null && message.hasOwnProperty("throughputMode"))
                                    if (typeof message.throughputMode !== "boolean")
                                        return "throughputMode: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates an UpdateDatabaseDdlRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlRequest} UpdateDatabaseDdlRequest
                             */
                            UpdateDatabaseDdlRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateDatabaseDdlRequest();
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.statements) {
                                    if (!Array.isArray(object.statements))
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlRequest.statements: array expected");
                                    message.statements = [];
                                    for (var i = 0; i < object.statements.length; ++i)
                                        message.statements[i] = String(object.statements[i]);
                                }
                                if (object.operationId != null)
                                    message.operationId = String(object.operationId);
                                if (object.protoDescriptors != null)
                                    if (typeof object.protoDescriptors === "string")
                                        $util.base64.decode(object.protoDescriptors, message.protoDescriptors = $util.newBuffer($util.base64.length(object.protoDescriptors)), 0);
                                    else if (object.protoDescriptors.length >= 0)
                                        message.protoDescriptors = object.protoDescriptors;
                                if (object.throughputMode != null)
                                    message.throughputMode = Boolean(object.throughputMode);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateDatabaseDdlRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateDatabaseDdlRequest} message UpdateDatabaseDdlRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateDatabaseDdlRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.statements = [];
                                if (options.defaults) {
                                    object.database = "";
                                    object.operationId = "";
                                    if (options.bytes === String)
                                        object.protoDescriptors = "";
                                    else {
                                        object.protoDescriptors = [];
                                        if (options.bytes !== Array)
                                            object.protoDescriptors = $util.newBuffer(object.protoDescriptors);
                                    }
                                    object.throughputMode = false;
                                }
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.statements && message.statements.length) {
                                    object.statements = [];
                                    for (var j = 0; j < message.statements.length; ++j)
                                        object.statements[j] = message.statements[j];
                                }
                                if (message.operationId != null && message.hasOwnProperty("operationId"))
                                    object.operationId = message.operationId;
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    object.protoDescriptors = options.bytes === String ? $util.base64.encode(message.protoDescriptors, 0, message.protoDescriptors.length) : options.bytes === Array ? Array.prototype.slice.call(message.protoDescriptors) : message.protoDescriptors;
                                if (message.throughputMode != null && message.hasOwnProperty("throughputMode"))
                                    object.throughputMode = message.throughputMode;
                                return object;
                            };
    
                            /**
                             * Converts this UpdateDatabaseDdlRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateDatabaseDdlRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateDatabaseDdlRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateDatabaseDdlRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateDatabaseDdlRequest";
                            };
    
                            return UpdateDatabaseDdlRequest;
                        })();
    
                        v1.DdlStatementActionInfo = (function() {
    
                            /**
                             * Properties of a DdlStatementActionInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDdlStatementActionInfo
                             * @property {string|null} [action] DdlStatementActionInfo action
                             * @property {string|null} [entityType] DdlStatementActionInfo entityType
                             * @property {Array.<string>|null} [entityNames] DdlStatementActionInfo entityNames
                             */
    
                            /**
                             * Constructs a new DdlStatementActionInfo.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DdlStatementActionInfo.
                             * @implements IDdlStatementActionInfo
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDdlStatementActionInfo=} [properties] Properties to set
                             */
                            function DdlStatementActionInfo(properties) {
                                this.entityNames = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DdlStatementActionInfo action.
                             * @member {string} action
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @instance
                             */
                            DdlStatementActionInfo.prototype.action = "";
    
                            /**
                             * DdlStatementActionInfo entityType.
                             * @member {string} entityType
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @instance
                             */
                            DdlStatementActionInfo.prototype.entityType = "";
    
                            /**
                             * DdlStatementActionInfo entityNames.
                             * @member {Array.<string>} entityNames
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @instance
                             */
                            DdlStatementActionInfo.prototype.entityNames = $util.emptyArray;
    
                            /**
                             * Creates a new DdlStatementActionInfo instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IDdlStatementActionInfo=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.DdlStatementActionInfo} DdlStatementActionInfo instance
                             */
                            DdlStatementActionInfo.create = function create(properties) {
                                return new DdlStatementActionInfo(properties);
                            };
    
                            /**
                             * Encodes the specified DdlStatementActionInfo message. Does not implicitly {@link google.spanner.admin.database.v1.DdlStatementActionInfo.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IDdlStatementActionInfo} message DdlStatementActionInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DdlStatementActionInfo.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.action);
                                if (message.entityType != null && Object.hasOwnProperty.call(message, "entityType"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.entityType);
                                if (message.entityNames != null && message.entityNames.length)
                                    for (var i = 0; i < message.entityNames.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.entityNames[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DdlStatementActionInfo message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.DdlStatementActionInfo.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.IDdlStatementActionInfo} message DdlStatementActionInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DdlStatementActionInfo.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DdlStatementActionInfo message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.DdlStatementActionInfo} DdlStatementActionInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DdlStatementActionInfo.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.DdlStatementActionInfo();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.action = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.entityType = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.entityNames && message.entityNames.length))
                                                message.entityNames = [];
                                            message.entityNames.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DdlStatementActionInfo message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.DdlStatementActionInfo} DdlStatementActionInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DdlStatementActionInfo.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DdlStatementActionInfo message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DdlStatementActionInfo.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.action != null && message.hasOwnProperty("action"))
                                    if (!$util.isString(message.action))
                                        return "action: string expected";
                                if (message.entityType != null && message.hasOwnProperty("entityType"))
                                    if (!$util.isString(message.entityType))
                                        return "entityType: string expected";
                                if (message.entityNames != null && message.hasOwnProperty("entityNames")) {
                                    if (!Array.isArray(message.entityNames))
                                        return "entityNames: array expected";
                                    for (var i = 0; i < message.entityNames.length; ++i)
                                        if (!$util.isString(message.entityNames[i]))
                                            return "entityNames: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a DdlStatementActionInfo message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.DdlStatementActionInfo} DdlStatementActionInfo
                             */
                            DdlStatementActionInfo.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.DdlStatementActionInfo)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.DdlStatementActionInfo();
                                if (object.action != null)
                                    message.action = String(object.action);
                                if (object.entityType != null)
                                    message.entityType = String(object.entityType);
                                if (object.entityNames) {
                                    if (!Array.isArray(object.entityNames))
                                        throw TypeError(".google.spanner.admin.database.v1.DdlStatementActionInfo.entityNames: array expected");
                                    message.entityNames = [];
                                    for (var i = 0; i < object.entityNames.length; ++i)
                                        message.entityNames[i] = String(object.entityNames[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DdlStatementActionInfo message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {google.spanner.admin.database.v1.DdlStatementActionInfo} message DdlStatementActionInfo
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DdlStatementActionInfo.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.entityNames = [];
                                if (options.defaults) {
                                    object.action = "";
                                    object.entityType = "";
                                }
                                if (message.action != null && message.hasOwnProperty("action"))
                                    object.action = message.action;
                                if (message.entityType != null && message.hasOwnProperty("entityType"))
                                    object.entityType = message.entityType;
                                if (message.entityNames && message.entityNames.length) {
                                    object.entityNames = [];
                                    for (var j = 0; j < message.entityNames.length; ++j)
                                        object.entityNames[j] = message.entityNames[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this DdlStatementActionInfo to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DdlStatementActionInfo.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DdlStatementActionInfo
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.DdlStatementActionInfo
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DdlStatementActionInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.DdlStatementActionInfo";
                            };
    
                            return DdlStatementActionInfo;
                        })();
    
                        v1.UpdateDatabaseDdlMetadata = (function() {
    
                            /**
                             * Properties of an UpdateDatabaseDdlMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IUpdateDatabaseDdlMetadata
                             * @property {string|null} [database] UpdateDatabaseDdlMetadata database
                             * @property {Array.<string>|null} [statements] UpdateDatabaseDdlMetadata statements
                             * @property {Array.<google.protobuf.ITimestamp>|null} [commitTimestamps] UpdateDatabaseDdlMetadata commitTimestamps
                             * @property {boolean|null} [throttled] UpdateDatabaseDdlMetadata throttled
                             * @property {Array.<google.spanner.admin.database.v1.IOperationProgress>|null} [progress] UpdateDatabaseDdlMetadata progress
                             * @property {Array.<google.spanner.admin.database.v1.IDdlStatementActionInfo>|null} [actions] UpdateDatabaseDdlMetadata actions
                             */
    
                            /**
                             * Constructs a new UpdateDatabaseDdlMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an UpdateDatabaseDdlMetadata.
                             * @implements IUpdateDatabaseDdlMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlMetadata=} [properties] Properties to set
                             */
                            function UpdateDatabaseDdlMetadata(properties) {
                                this.statements = [];
                                this.commitTimestamps = [];
                                this.progress = [];
                                this.actions = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateDatabaseDdlMetadata database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.database = "";
    
                            /**
                             * UpdateDatabaseDdlMetadata statements.
                             * @member {Array.<string>} statements
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.statements = $util.emptyArray;
    
                            /**
                             * UpdateDatabaseDdlMetadata commitTimestamps.
                             * @member {Array.<google.protobuf.ITimestamp>} commitTimestamps
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.commitTimestamps = $util.emptyArray;
    
                            /**
                             * UpdateDatabaseDdlMetadata throttled.
                             * @member {boolean} throttled
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.throttled = false;
    
                            /**
                             * UpdateDatabaseDdlMetadata progress.
                             * @member {Array.<google.spanner.admin.database.v1.IOperationProgress>} progress
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.progress = $util.emptyArray;
    
                            /**
                             * UpdateDatabaseDdlMetadata actions.
                             * @member {Array.<google.spanner.admin.database.v1.IDdlStatementActionInfo>} actions
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             */
                            UpdateDatabaseDdlMetadata.prototype.actions = $util.emptyArray;
    
                            /**
                             * Creates a new UpdateDatabaseDdlMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata} UpdateDatabaseDdlMetadata instance
                             */
                            UpdateDatabaseDdlMetadata.create = function create(properties) {
                                return new UpdateDatabaseDdlMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseDdlMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlMetadata} message UpdateDatabaseDdlMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseDdlMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                if (message.statements != null && message.statements.length)
                                    for (var i = 0; i < message.statements.length; ++i)
                                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.statements[i]);
                                if (message.commitTimestamps != null && message.commitTimestamps.length)
                                    for (var i = 0; i < message.commitTimestamps.length; ++i)
                                        $root.google.protobuf.Timestamp.encode(message.commitTimestamps[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.throttled != null && Object.hasOwnProperty.call(message, "throttled"))
                                    writer.uint32(/* id 4, wireType 0 =*/32).bool(message.throttled);
                                if (message.progress != null && message.progress.length)
                                    for (var i = 0; i < message.progress.length; ++i)
                                        $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                if (message.actions != null && message.actions.length)
                                    for (var i = 0; i < message.actions.length; ++i)
                                        $root.google.spanner.admin.database.v1.DdlStatementActionInfo.encode(message.actions[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateDatabaseDdlMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IUpdateDatabaseDdlMetadata} message UpdateDatabaseDdlMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateDatabaseDdlMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateDatabaseDdlMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata} UpdateDatabaseDdlMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseDdlMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.statements && message.statements.length))
                                                message.statements = [];
                                            message.statements.push(reader.string());
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.commitTimestamps && message.commitTimestamps.length))
                                                message.commitTimestamps = [];
                                            message.commitTimestamps.push($root.google.protobuf.Timestamp.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 4: {
                                            message.throttled = reader.bool();
                                            break;
                                        }
                                    case 5: {
                                            if (!(message.progress && message.progress.length))
                                                message.progress = [];
                                            message.progress.push($root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 6: {
                                            if (!(message.actions && message.actions.length))
                                                message.actions = [];
                                            message.actions.push($root.google.spanner.admin.database.v1.DdlStatementActionInfo.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateDatabaseDdlMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata} UpdateDatabaseDdlMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateDatabaseDdlMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateDatabaseDdlMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateDatabaseDdlMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.statements != null && message.hasOwnProperty("statements")) {
                                    if (!Array.isArray(message.statements))
                                        return "statements: array expected";
                                    for (var i = 0; i < message.statements.length; ++i)
                                        if (!$util.isString(message.statements[i]))
                                            return "statements: string[] expected";
                                }
                                if (message.commitTimestamps != null && message.hasOwnProperty("commitTimestamps")) {
                                    if (!Array.isArray(message.commitTimestamps))
                                        return "commitTimestamps: array expected";
                                    for (var i = 0; i < message.commitTimestamps.length; ++i) {
                                        var error = $root.google.protobuf.Timestamp.verify(message.commitTimestamps[i]);
                                        if (error)
                                            return "commitTimestamps." + error;
                                    }
                                }
                                if (message.throttled != null && message.hasOwnProperty("throttled"))
                                    if (typeof message.throttled !== "boolean")
                                        return "throttled: boolean expected";
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    if (!Array.isArray(message.progress))
                                        return "progress: array expected";
                                    for (var i = 0; i < message.progress.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress[i]);
                                        if (error)
                                            return "progress." + error;
                                    }
                                }
                                if (message.actions != null && message.hasOwnProperty("actions")) {
                                    if (!Array.isArray(message.actions))
                                        return "actions: array expected";
                                    for (var i = 0; i < message.actions.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.DdlStatementActionInfo.verify(message.actions[i]);
                                        if (error)
                                            return "actions." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateDatabaseDdlMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata} UpdateDatabaseDdlMetadata
                             */
                            UpdateDatabaseDdlMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata();
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.statements) {
                                    if (!Array.isArray(object.statements))
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.statements: array expected");
                                    message.statements = [];
                                    for (var i = 0; i < object.statements.length; ++i)
                                        message.statements[i] = String(object.statements[i]);
                                }
                                if (object.commitTimestamps) {
                                    if (!Array.isArray(object.commitTimestamps))
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.commitTimestamps: array expected");
                                    message.commitTimestamps = [];
                                    for (var i = 0; i < object.commitTimestamps.length; ++i) {
                                        if (typeof object.commitTimestamps[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.commitTimestamps: object expected");
                                        message.commitTimestamps[i] = $root.google.protobuf.Timestamp.fromObject(object.commitTimestamps[i]);
                                    }
                                }
                                if (object.throttled != null)
                                    message.throttled = Boolean(object.throttled);
                                if (object.progress) {
                                    if (!Array.isArray(object.progress))
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.progress: array expected");
                                    message.progress = [];
                                    for (var i = 0; i < object.progress.length; ++i) {
                                        if (typeof object.progress[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.progress: object expected");
                                        message.progress[i] = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress[i]);
                                    }
                                }
                                if (object.actions) {
                                    if (!Array.isArray(object.actions))
                                        throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.actions: array expected");
                                    message.actions = [];
                                    for (var i = 0; i < object.actions.length; ++i) {
                                        if (typeof object.actions[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata.actions: object expected");
                                        message.actions[i] = $root.google.spanner.admin.database.v1.DdlStatementActionInfo.fromObject(object.actions[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateDatabaseDdlMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata} message UpdateDatabaseDdlMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateDatabaseDdlMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.statements = [];
                                    object.commitTimestamps = [];
                                    object.progress = [];
                                    object.actions = [];
                                }
                                if (options.defaults) {
                                    object.database = "";
                                    object.throttled = false;
                                }
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.statements && message.statements.length) {
                                    object.statements = [];
                                    for (var j = 0; j < message.statements.length; ++j)
                                        object.statements[j] = message.statements[j];
                                }
                                if (message.commitTimestamps && message.commitTimestamps.length) {
                                    object.commitTimestamps = [];
                                    for (var j = 0; j < message.commitTimestamps.length; ++j)
                                        object.commitTimestamps[j] = $root.google.protobuf.Timestamp.toObject(message.commitTimestamps[j], options);
                                }
                                if (message.throttled != null && message.hasOwnProperty("throttled"))
                                    object.throttled = message.throttled;
                                if (message.progress && message.progress.length) {
                                    object.progress = [];
                                    for (var j = 0; j < message.progress.length; ++j)
                                        object.progress[j] = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress[j], options);
                                }
                                if (message.actions && message.actions.length) {
                                    object.actions = [];
                                    for (var j = 0; j < message.actions.length; ++j)
                                        object.actions[j] = $root.google.spanner.admin.database.v1.DdlStatementActionInfo.toObject(message.actions[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this UpdateDatabaseDdlMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateDatabaseDdlMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateDatabaseDdlMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateDatabaseDdlMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata";
                            };
    
                            return UpdateDatabaseDdlMetadata;
                        })();
    
                        v1.DropDatabaseRequest = (function() {
    
                            /**
                             * Properties of a DropDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDropDatabaseRequest
                             * @property {string|null} [database] DropDatabaseRequest database
                             */
    
                            /**
                             * Constructs a new DropDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DropDatabaseRequest.
                             * @implements IDropDatabaseRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest=} [properties] Properties to set
                             */
                            function DropDatabaseRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DropDatabaseRequest database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @instance
                             */
                            DropDatabaseRequest.prototype.database = "";
    
                            /**
                             * Creates a new DropDatabaseRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.DropDatabaseRequest} DropDatabaseRequest instance
                             */
                            DropDatabaseRequest.create = function create(properties) {
                                return new DropDatabaseRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DropDatabaseRequest message. Does not implicitly {@link google.spanner.admin.database.v1.DropDatabaseRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest} message DropDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DropDatabaseRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DropDatabaseRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.DropDatabaseRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IDropDatabaseRequest} message DropDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DropDatabaseRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DropDatabaseRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.DropDatabaseRequest} DropDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DropDatabaseRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.DropDatabaseRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DropDatabaseRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.DropDatabaseRequest} DropDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DropDatabaseRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DropDatabaseRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DropDatabaseRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DropDatabaseRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.DropDatabaseRequest} DropDatabaseRequest
                             */
                            DropDatabaseRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.DropDatabaseRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.DropDatabaseRequest();
                                if (object.database != null)
                                    message.database = String(object.database);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DropDatabaseRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.DropDatabaseRequest} message DropDatabaseRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DropDatabaseRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.database = "";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                return object;
                            };
    
                            /**
                             * Converts this DropDatabaseRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DropDatabaseRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DropDatabaseRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.DropDatabaseRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DropDatabaseRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.DropDatabaseRequest";
                            };
    
                            return DropDatabaseRequest;
                        })();
    
                        v1.GetDatabaseDdlRequest = (function() {
    
                            /**
                             * Properties of a GetDatabaseDdlRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IGetDatabaseDdlRequest
                             * @property {string|null} [database] GetDatabaseDdlRequest database
                             */
    
                            /**
                             * Constructs a new GetDatabaseDdlRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a GetDatabaseDdlRequest.
                             * @implements IGetDatabaseDdlRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest=} [properties] Properties to set
                             */
                            function GetDatabaseDdlRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetDatabaseDdlRequest database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @instance
                             */
                            GetDatabaseDdlRequest.prototype.database = "";
    
                            /**
                             * Creates a new GetDatabaseDdlRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlRequest} GetDatabaseDdlRequest instance
                             */
                            GetDatabaseDdlRequest.create = function create(properties) {
                                return new GetDatabaseDdlRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetDatabaseDdlRequest message. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseDdlRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest} message GetDatabaseDdlRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseDdlRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetDatabaseDdlRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseDdlRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlRequest} message GetDatabaseDdlRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseDdlRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetDatabaseDdlRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlRequest} GetDatabaseDdlRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseDdlRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.GetDatabaseDdlRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetDatabaseDdlRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlRequest} GetDatabaseDdlRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseDdlRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetDatabaseDdlRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetDatabaseDdlRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetDatabaseDdlRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlRequest} GetDatabaseDdlRequest
                             */
                            GetDatabaseDdlRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.GetDatabaseDdlRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.GetDatabaseDdlRequest();
                                if (object.database != null)
                                    message.database = String(object.database);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetDatabaseDdlRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.GetDatabaseDdlRequest} message GetDatabaseDdlRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetDatabaseDdlRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.database = "";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                return object;
                            };
    
                            /**
                             * Converts this GetDatabaseDdlRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetDatabaseDdlRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetDatabaseDdlRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetDatabaseDdlRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.GetDatabaseDdlRequest";
                            };
    
                            return GetDatabaseDdlRequest;
                        })();
    
                        v1.GetDatabaseDdlResponse = (function() {
    
                            /**
                             * Properties of a GetDatabaseDdlResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IGetDatabaseDdlResponse
                             * @property {Array.<string>|null} [statements] GetDatabaseDdlResponse statements
                             * @property {Uint8Array|null} [protoDescriptors] GetDatabaseDdlResponse protoDescriptors
                             */
    
                            /**
                             * Constructs a new GetDatabaseDdlResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a GetDatabaseDdlResponse.
                             * @implements IGetDatabaseDdlResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlResponse=} [properties] Properties to set
                             */
                            function GetDatabaseDdlResponse(properties) {
                                this.statements = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetDatabaseDdlResponse statements.
                             * @member {Array.<string>} statements
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @instance
                             */
                            GetDatabaseDdlResponse.prototype.statements = $util.emptyArray;
    
                            /**
                             * GetDatabaseDdlResponse protoDescriptors.
                             * @member {Uint8Array} protoDescriptors
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @instance
                             */
                            GetDatabaseDdlResponse.prototype.protoDescriptors = $util.newBuffer([]);
    
                            /**
                             * Creates a new GetDatabaseDdlResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlResponse} GetDatabaseDdlResponse instance
                             */
                            GetDatabaseDdlResponse.create = function create(properties) {
                                return new GetDatabaseDdlResponse(properties);
                            };
    
                            /**
                             * Encodes the specified GetDatabaseDdlResponse message. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseDdlResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlResponse} message GetDatabaseDdlResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseDdlResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.statements != null && message.statements.length)
                                    for (var i = 0; i < message.statements.length; ++i)
                                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.statements[i]);
                                if (message.protoDescriptors != null && Object.hasOwnProperty.call(message, "protoDescriptors"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.protoDescriptors);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetDatabaseDdlResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.GetDatabaseDdlResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IGetDatabaseDdlResponse} message GetDatabaseDdlResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetDatabaseDdlResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetDatabaseDdlResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlResponse} GetDatabaseDdlResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseDdlResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.GetDatabaseDdlResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.statements && message.statements.length))
                                                message.statements = [];
                                            message.statements.push(reader.string());
                                            break;
                                        }
                                    case 2: {
                                            message.protoDescriptors = reader.bytes();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetDatabaseDdlResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlResponse} GetDatabaseDdlResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetDatabaseDdlResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetDatabaseDdlResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetDatabaseDdlResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.statements != null && message.hasOwnProperty("statements")) {
                                    if (!Array.isArray(message.statements))
                                        return "statements: array expected";
                                    for (var i = 0; i < message.statements.length; ++i)
                                        if (!$util.isString(message.statements[i]))
                                            return "statements: string[] expected";
                                }
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    if (!(message.protoDescriptors && typeof message.protoDescriptors.length === "number" || $util.isString(message.protoDescriptors)))
                                        return "protoDescriptors: buffer expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetDatabaseDdlResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.GetDatabaseDdlResponse} GetDatabaseDdlResponse
                             */
                            GetDatabaseDdlResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.GetDatabaseDdlResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.GetDatabaseDdlResponse();
                                if (object.statements) {
                                    if (!Array.isArray(object.statements))
                                        throw TypeError(".google.spanner.admin.database.v1.GetDatabaseDdlResponse.statements: array expected");
                                    message.statements = [];
                                    for (var i = 0; i < object.statements.length; ++i)
                                        message.statements[i] = String(object.statements[i]);
                                }
                                if (object.protoDescriptors != null)
                                    if (typeof object.protoDescriptors === "string")
                                        $util.base64.decode(object.protoDescriptors, message.protoDescriptors = $util.newBuffer($util.base64.length(object.protoDescriptors)), 0);
                                    else if (object.protoDescriptors.length >= 0)
                                        message.protoDescriptors = object.protoDescriptors;
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetDatabaseDdlResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.GetDatabaseDdlResponse} message GetDatabaseDdlResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetDatabaseDdlResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.statements = [];
                                if (options.defaults)
                                    if (options.bytes === String)
                                        object.protoDescriptors = "";
                                    else {
                                        object.protoDescriptors = [];
                                        if (options.bytes !== Array)
                                            object.protoDescriptors = $util.newBuffer(object.protoDescriptors);
                                    }
                                if (message.statements && message.statements.length) {
                                    object.statements = [];
                                    for (var j = 0; j < message.statements.length; ++j)
                                        object.statements[j] = message.statements[j];
                                }
                                if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors"))
                                    object.protoDescriptors = options.bytes === String ? $util.base64.encode(message.protoDescriptors, 0, message.protoDescriptors.length) : options.bytes === Array ? Array.prototype.slice.call(message.protoDescriptors) : message.protoDescriptors;
                                return object;
                            };
    
                            /**
                             * Converts this GetDatabaseDdlResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetDatabaseDdlResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetDatabaseDdlResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.GetDatabaseDdlResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetDatabaseDdlResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.GetDatabaseDdlResponse";
                            };
    
                            return GetDatabaseDdlResponse;
                        })();
    
                        v1.ListDatabaseOperationsRequest = (function() {
    
                            /**
                             * Properties of a ListDatabaseOperationsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabaseOperationsRequest
                             * @property {string|null} [parent] ListDatabaseOperationsRequest parent
                             * @property {string|null} [filter] ListDatabaseOperationsRequest filter
                             * @property {number|null} [pageSize] ListDatabaseOperationsRequest pageSize
                             * @property {string|null} [pageToken] ListDatabaseOperationsRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListDatabaseOperationsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabaseOperationsRequest.
                             * @implements IListDatabaseOperationsRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest=} [properties] Properties to set
                             */
                            function ListDatabaseOperationsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabaseOperationsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @instance
                             */
                            ListDatabaseOperationsRequest.prototype.parent = "";
    
                            /**
                             * ListDatabaseOperationsRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @instance
                             */
                            ListDatabaseOperationsRequest.prototype.filter = "";
    
                            /**
                             * ListDatabaseOperationsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @instance
                             */
                            ListDatabaseOperationsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListDatabaseOperationsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @instance
                             */
                            ListDatabaseOperationsRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListDatabaseOperationsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsRequest} ListDatabaseOperationsRequest instance
                             */
                            ListDatabaseOperationsRequest.create = function create(properties) {
                                return new ListDatabaseOperationsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabaseOperationsRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseOperationsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest} message ListDatabaseOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseOperationsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabaseOperationsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseOperationsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsRequest} message ListDatabaseOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabaseOperationsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsRequest} ListDatabaseOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseOperationsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabaseOperationsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabaseOperationsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsRequest} ListDatabaseOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabaseOperationsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabaseOperationsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabaseOperationsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsRequest} ListDatabaseOperationsRequest
                             */
                            ListDatabaseOperationsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabaseOperationsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabaseOperationsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabaseOperationsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabaseOperationsRequest} message ListDatabaseOperationsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabaseOperationsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.filter = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabaseOperationsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabaseOperationsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabaseOperationsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabaseOperationsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabaseOperationsRequest";
                            };
    
                            return ListDatabaseOperationsRequest;
                        })();
    
                        v1.ListDatabaseOperationsResponse = (function() {
    
                            /**
                             * Properties of a ListDatabaseOperationsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabaseOperationsResponse
                             * @property {Array.<google.longrunning.IOperation>|null} [operations] ListDatabaseOperationsResponse operations
                             * @property {string|null} [nextPageToken] ListDatabaseOperationsResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListDatabaseOperationsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabaseOperationsResponse.
                             * @implements IListDatabaseOperationsResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsResponse=} [properties] Properties to set
                             */
                            function ListDatabaseOperationsResponse(properties) {
                                this.operations = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabaseOperationsResponse operations.
                             * @member {Array.<google.longrunning.IOperation>} operations
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @instance
                             */
                            ListDatabaseOperationsResponse.prototype.operations = $util.emptyArray;
    
                            /**
                             * ListDatabaseOperationsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @instance
                             */
                            ListDatabaseOperationsResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListDatabaseOperationsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} ListDatabaseOperationsResponse instance
                             */
                            ListDatabaseOperationsResponse.create = function create(properties) {
                                return new ListDatabaseOperationsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabaseOperationsResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseOperationsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsResponse} message ListDatabaseOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseOperationsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.operations != null && message.operations.length)
                                    for (var i = 0; i < message.operations.length; ++i)
                                        $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabaseOperationsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseOperationsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseOperationsResponse} message ListDatabaseOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabaseOperationsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} ListDatabaseOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseOperationsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabaseOperationsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.operations && message.operations.length))
                                                message.operations = [];
                                            message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabaseOperationsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} ListDatabaseOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabaseOperationsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabaseOperationsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.operations != null && message.hasOwnProperty("operations")) {
                                    if (!Array.isArray(message.operations))
                                        return "operations: array expected";
                                    for (var i = 0; i < message.operations.length; ++i) {
                                        var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                                        if (error)
                                            return "operations." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabaseOperationsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} ListDatabaseOperationsResponse
                             */
                            ListDatabaseOperationsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabaseOperationsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabaseOperationsResponse();
                                if (object.operations) {
                                    if (!Array.isArray(object.operations))
                                        throw TypeError(".google.spanner.admin.database.v1.ListDatabaseOperationsResponse.operations: array expected");
                                    message.operations = [];
                                    for (var i = 0; i < object.operations.length; ++i) {
                                        if (typeof object.operations[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListDatabaseOperationsResponse.operations: object expected");
                                        message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabaseOperationsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabaseOperationsResponse} message ListDatabaseOperationsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabaseOperationsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.operations = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.operations && message.operations.length) {
                                    object.operations = [];
                                    for (var j = 0; j < message.operations.length; ++j)
                                        object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabaseOperationsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabaseOperationsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabaseOperationsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabaseOperationsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabaseOperationsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabaseOperationsResponse";
                            };
    
                            return ListDatabaseOperationsResponse;
                        })();
    
                        v1.RestoreDatabaseRequest = (function() {
    
                            /**
                             * Properties of a RestoreDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IRestoreDatabaseRequest
                             * @property {string|null} [parent] RestoreDatabaseRequest parent
                             * @property {string|null} [databaseId] RestoreDatabaseRequest databaseId
                             * @property {string|null} [backup] RestoreDatabaseRequest backup
                             * @property {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig|null} [encryptionConfig] RestoreDatabaseRequest encryptionConfig
                             */
    
                            /**
                             * Constructs a new RestoreDatabaseRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a RestoreDatabaseRequest.
                             * @implements IRestoreDatabaseRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest=} [properties] Properties to set
                             */
                            function RestoreDatabaseRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * RestoreDatabaseRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             */
                            RestoreDatabaseRequest.prototype.parent = "";
    
                            /**
                             * RestoreDatabaseRequest databaseId.
                             * @member {string} databaseId
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             */
                            RestoreDatabaseRequest.prototype.databaseId = "";
    
                            /**
                             * RestoreDatabaseRequest backup.
                             * @member {string|null|undefined} backup
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             */
                            RestoreDatabaseRequest.prototype.backup = null;
    
                            /**
                             * RestoreDatabaseRequest encryptionConfig.
                             * @member {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig|null|undefined} encryptionConfig
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             */
                            RestoreDatabaseRequest.prototype.encryptionConfig = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * RestoreDatabaseRequest source.
                             * @member {"backup"|undefined} source
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             */
                            Object.defineProperty(RestoreDatabaseRequest.prototype, "source", {
                                get: $util.oneOfGetter($oneOfFields = ["backup"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new RestoreDatabaseRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseRequest} RestoreDatabaseRequest instance
                             */
                            RestoreDatabaseRequest.create = function create(properties) {
                                return new RestoreDatabaseRequest(properties);
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseRequest message. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest} message RestoreDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.databaseId);
                                if (message.backup != null && Object.hasOwnProperty.call(message, "backup"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.backup);
                                if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                    $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseRequest} message RestoreDatabaseRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a RestoreDatabaseRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseRequest} RestoreDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.RestoreDatabaseRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.databaseId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.backup = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.encryptionConfig = $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a RestoreDatabaseRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseRequest} RestoreDatabaseRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a RestoreDatabaseRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            RestoreDatabaseRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                    if (!$util.isString(message.databaseId))
                                        return "databaseId: string expected";
                                if (message.backup != null && message.hasOwnProperty("backup")) {
                                    properties.source = 1;
                                    if (!$util.isString(message.backup))
                                        return "backup: string expected";
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                    var error = $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.verify(message.encryptionConfig);
                                    if (error)
                                        return "encryptionConfig." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a RestoreDatabaseRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseRequest} RestoreDatabaseRequest
                             */
                            RestoreDatabaseRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.RestoreDatabaseRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.RestoreDatabaseRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.databaseId != null)
                                    message.databaseId = String(object.databaseId);
                                if (object.backup != null)
                                    message.backup = String(object.backup);
                                if (object.encryptionConfig != null) {
                                    if (typeof object.encryptionConfig !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreDatabaseRequest.encryptionConfig: object expected");
                                    message.encryptionConfig = $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.fromObject(object.encryptionConfig);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a RestoreDatabaseRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.RestoreDatabaseRequest} message RestoreDatabaseRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            RestoreDatabaseRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.databaseId = "";
                                    object.encryptionConfig = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                    object.databaseId = message.databaseId;
                                if (message.backup != null && message.hasOwnProperty("backup")) {
                                    object.backup = message.backup;
                                    if (options.oneofs)
                                        object.source = "backup";
                                }
                                if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                    object.encryptionConfig = $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.toObject(message.encryptionConfig, options);
                                return object;
                            };
    
                            /**
                             * Converts this RestoreDatabaseRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            RestoreDatabaseRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for RestoreDatabaseRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            RestoreDatabaseRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.RestoreDatabaseRequest";
                            };
    
                            return RestoreDatabaseRequest;
                        })();
    
                        v1.RestoreDatabaseEncryptionConfig = (function() {
    
                            /**
                             * Properties of a RestoreDatabaseEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IRestoreDatabaseEncryptionConfig
                             * @property {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType|null} [encryptionType] RestoreDatabaseEncryptionConfig encryptionType
                             * @property {string|null} [kmsKeyName] RestoreDatabaseEncryptionConfig kmsKeyName
                             * @property {Array.<string>|null} [kmsKeyNames] RestoreDatabaseEncryptionConfig kmsKeyNames
                             */
    
                            /**
                             * Constructs a new RestoreDatabaseEncryptionConfig.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a RestoreDatabaseEncryptionConfig.
                             * @implements IRestoreDatabaseEncryptionConfig
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig=} [properties] Properties to set
                             */
                            function RestoreDatabaseEncryptionConfig(properties) {
                                this.kmsKeyNames = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * RestoreDatabaseEncryptionConfig encryptionType.
                             * @member {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType} encryptionType
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @instance
                             */
                            RestoreDatabaseEncryptionConfig.prototype.encryptionType = 0;
    
                            /**
                             * RestoreDatabaseEncryptionConfig kmsKeyName.
                             * @member {string} kmsKeyName
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @instance
                             */
                            RestoreDatabaseEncryptionConfig.prototype.kmsKeyName = "";
    
                            /**
                             * RestoreDatabaseEncryptionConfig kmsKeyNames.
                             * @member {Array.<string>} kmsKeyNames
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @instance
                             */
                            RestoreDatabaseEncryptionConfig.prototype.kmsKeyNames = $util.emptyArray;
    
                            /**
                             * Creates a new RestoreDatabaseEncryptionConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig} RestoreDatabaseEncryptionConfig instance
                             */
                            RestoreDatabaseEncryptionConfig.create = function create(properties) {
                                return new RestoreDatabaseEncryptionConfig(properties);
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseEncryptionConfig message. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig} message RestoreDatabaseEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseEncryptionConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.encryptionType != null && Object.hasOwnProperty.call(message, "encryptionType"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.encryptionType);
                                if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                                if (message.kmsKeyNames != null && message.kmsKeyNames.length)
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.kmsKeyNames[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseEncryptionConfig message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseEncryptionConfig} message RestoreDatabaseEncryptionConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseEncryptionConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a RestoreDatabaseEncryptionConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig} RestoreDatabaseEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseEncryptionConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.encryptionType = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.kmsKeyName = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.kmsKeyNames && message.kmsKeyNames.length))
                                                message.kmsKeyNames = [];
                                            message.kmsKeyNames.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a RestoreDatabaseEncryptionConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig} RestoreDatabaseEncryptionConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseEncryptionConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a RestoreDatabaseEncryptionConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            RestoreDatabaseEncryptionConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    switch (message.encryptionType) {
                                    default:
                                        return "encryptionType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    if (!$util.isString(message.kmsKeyName))
                                        return "kmsKeyName: string expected";
                                if (message.kmsKeyNames != null && message.hasOwnProperty("kmsKeyNames")) {
                                    if (!Array.isArray(message.kmsKeyNames))
                                        return "kmsKeyNames: array expected";
                                    for (var i = 0; i < message.kmsKeyNames.length; ++i)
                                        if (!$util.isString(message.kmsKeyNames[i]))
                                            return "kmsKeyNames: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a RestoreDatabaseEncryptionConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig} RestoreDatabaseEncryptionConfig
                             */
                            RestoreDatabaseEncryptionConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig();
                                switch (object.encryptionType) {
                                default:
                                    if (typeof object.encryptionType === "number") {
                                        message.encryptionType = object.encryptionType;
                                        break;
                                    }
                                    break;
                                case "ENCRYPTION_TYPE_UNSPECIFIED":
                                case 0:
                                    message.encryptionType = 0;
                                    break;
                                case "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION":
                                case 1:
                                    message.encryptionType = 1;
                                    break;
                                case "GOOGLE_DEFAULT_ENCRYPTION":
                                case 2:
                                    message.encryptionType = 2;
                                    break;
                                case "CUSTOMER_MANAGED_ENCRYPTION":
                                case 3:
                                    message.encryptionType = 3;
                                    break;
                                }
                                if (object.kmsKeyName != null)
                                    message.kmsKeyName = String(object.kmsKeyName);
                                if (object.kmsKeyNames) {
                                    if (!Array.isArray(object.kmsKeyNames))
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.kmsKeyNames: array expected");
                                    message.kmsKeyNames = [];
                                    for (var i = 0; i < object.kmsKeyNames.length; ++i)
                                        message.kmsKeyNames[i] = String(object.kmsKeyNames[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a RestoreDatabaseEncryptionConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig} message RestoreDatabaseEncryptionConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            RestoreDatabaseEncryptionConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.kmsKeyNames = [];
                                if (options.defaults) {
                                    object.encryptionType = options.enums === String ? "ENCRYPTION_TYPE_UNSPECIFIED" : 0;
                                    object.kmsKeyName = "";
                                }
                                if (message.encryptionType != null && message.hasOwnProperty("encryptionType"))
                                    object.encryptionType = options.enums === String ? $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType[message.encryptionType] === undefined ? message.encryptionType : $root.google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType[message.encryptionType] : message.encryptionType;
                                if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                                    object.kmsKeyName = message.kmsKeyName;
                                if (message.kmsKeyNames && message.kmsKeyNames.length) {
                                    object.kmsKeyNames = [];
                                    for (var j = 0; j < message.kmsKeyNames.length; ++j)
                                        object.kmsKeyNames[j] = message.kmsKeyNames[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this RestoreDatabaseEncryptionConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            RestoreDatabaseEncryptionConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for RestoreDatabaseEncryptionConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            RestoreDatabaseEncryptionConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig";
                            };
    
                            /**
                             * EncryptionType enum.
                             * @name google.spanner.admin.database.v1.RestoreDatabaseEncryptionConfig.EncryptionType
                             * @enum {number}
                             * @property {number} ENCRYPTION_TYPE_UNSPECIFIED=0 ENCRYPTION_TYPE_UNSPECIFIED value
                             * @property {number} USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION=1 USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION value
                             * @property {number} GOOGLE_DEFAULT_ENCRYPTION=2 GOOGLE_DEFAULT_ENCRYPTION value
                             * @property {number} CUSTOMER_MANAGED_ENCRYPTION=3 CUSTOMER_MANAGED_ENCRYPTION value
                             */
                            RestoreDatabaseEncryptionConfig.EncryptionType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "ENCRYPTION_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "USE_CONFIG_DEFAULT_OR_BACKUP_ENCRYPTION"] = 1;
                                values[valuesById[2] = "GOOGLE_DEFAULT_ENCRYPTION"] = 2;
                                values[valuesById[3] = "CUSTOMER_MANAGED_ENCRYPTION"] = 3;
                                return values;
                            })();
    
                            return RestoreDatabaseEncryptionConfig;
                        })();
    
                        v1.RestoreDatabaseMetadata = (function() {
    
                            /**
                             * Properties of a RestoreDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IRestoreDatabaseMetadata
                             * @property {string|null} [name] RestoreDatabaseMetadata name
                             * @property {google.spanner.admin.database.v1.RestoreSourceType|null} [sourceType] RestoreDatabaseMetadata sourceType
                             * @property {google.spanner.admin.database.v1.IBackupInfo|null} [backupInfo] RestoreDatabaseMetadata backupInfo
                             * @property {google.spanner.admin.database.v1.IOperationProgress|null} [progress] RestoreDatabaseMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] RestoreDatabaseMetadata cancelTime
                             * @property {string|null} [optimizeDatabaseOperationName] RestoreDatabaseMetadata optimizeDatabaseOperationName
                             */
    
                            /**
                             * Constructs a new RestoreDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a RestoreDatabaseMetadata.
                             * @implements IRestoreDatabaseMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseMetadata=} [properties] Properties to set
                             */
                            function RestoreDatabaseMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * RestoreDatabaseMetadata name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.name = "";
    
                            /**
                             * RestoreDatabaseMetadata sourceType.
                             * @member {google.spanner.admin.database.v1.RestoreSourceType} sourceType
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.sourceType = 0;
    
                            /**
                             * RestoreDatabaseMetadata backupInfo.
                             * @member {google.spanner.admin.database.v1.IBackupInfo|null|undefined} backupInfo
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.backupInfo = null;
    
                            /**
                             * RestoreDatabaseMetadata progress.
                             * @member {google.spanner.admin.database.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.progress = null;
    
                            /**
                             * RestoreDatabaseMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.cancelTime = null;
    
                            /**
                             * RestoreDatabaseMetadata optimizeDatabaseOperationName.
                             * @member {string} optimizeDatabaseOperationName
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            RestoreDatabaseMetadata.prototype.optimizeDatabaseOperationName = "";
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * RestoreDatabaseMetadata sourceInfo.
                             * @member {"backupInfo"|undefined} sourceInfo
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             */
                            Object.defineProperty(RestoreDatabaseMetadata.prototype, "sourceInfo", {
                                get: $util.oneOfGetter($oneOfFields = ["backupInfo"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new RestoreDatabaseMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseMetadata} RestoreDatabaseMetadata instance
                             */
                            RestoreDatabaseMetadata.create = function create(properties) {
                                return new RestoreDatabaseMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseMetadata} message RestoreDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.sourceType != null && Object.hasOwnProperty.call(message, "sourceType"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.sourceType);
                                if (message.backupInfo != null && Object.hasOwnProperty.call(message, "backupInfo"))
                                    $root.google.spanner.admin.database.v1.BackupInfo.encode(message.backupInfo, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                if (message.optimizeDatabaseOperationName != null && Object.hasOwnProperty.call(message, "optimizeDatabaseOperationName"))
                                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.optimizeDatabaseOperationName);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified RestoreDatabaseMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.RestoreDatabaseMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IRestoreDatabaseMetadata} message RestoreDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            RestoreDatabaseMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a RestoreDatabaseMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseMetadata} RestoreDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.RestoreDatabaseMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.sourceType = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.progress = $root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 6: {
                                            message.optimizeDatabaseOperationName = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a RestoreDatabaseMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseMetadata} RestoreDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            RestoreDatabaseMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a RestoreDatabaseMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            RestoreDatabaseMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.sourceType != null && message.hasOwnProperty("sourceType"))
                                    switch (message.sourceType) {
                                    default:
                                        return "sourceType: enum value expected";
                                    case 0:
                                    case 1:
                                        break;
                                    }
                                if (message.backupInfo != null && message.hasOwnProperty("backupInfo")) {
                                    properties.sourceInfo = 1;
                                    {
                                        var error = $root.google.spanner.admin.database.v1.BackupInfo.verify(message.backupInfo);
                                        if (error)
                                            return "backupInfo." + error;
                                    }
                                }
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                if (message.optimizeDatabaseOperationName != null && message.hasOwnProperty("optimizeDatabaseOperationName"))
                                    if (!$util.isString(message.optimizeDatabaseOperationName))
                                        return "optimizeDatabaseOperationName: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a RestoreDatabaseMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.RestoreDatabaseMetadata} RestoreDatabaseMetadata
                             */
                            RestoreDatabaseMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.RestoreDatabaseMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.RestoreDatabaseMetadata();
                                if (object.name != null)
                                    message.name = String(object.name);
                                switch (object.sourceType) {
                                default:
                                    if (typeof object.sourceType === "number") {
                                        message.sourceType = object.sourceType;
                                        break;
                                    }
                                    break;
                                case "TYPE_UNSPECIFIED":
                                case 0:
                                    message.sourceType = 0;
                                    break;
                                case "BACKUP":
                                case 1:
                                    message.sourceType = 1;
                                    break;
                                }
                                if (object.backupInfo != null) {
                                    if (typeof object.backupInfo !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreDatabaseMetadata.backupInfo: object expected");
                                    message.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.fromObject(object.backupInfo);
                                }
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreDatabaseMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.RestoreDatabaseMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                if (object.optimizeDatabaseOperationName != null)
                                    message.optimizeDatabaseOperationName = String(object.optimizeDatabaseOperationName);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a RestoreDatabaseMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.RestoreDatabaseMetadata} message RestoreDatabaseMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            RestoreDatabaseMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.sourceType = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                                    object.progress = null;
                                    object.cancelTime = null;
                                    object.optimizeDatabaseOperationName = "";
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.sourceType != null && message.hasOwnProperty("sourceType"))
                                    object.sourceType = options.enums === String ? $root.google.spanner.admin.database.v1.RestoreSourceType[message.sourceType] === undefined ? message.sourceType : $root.google.spanner.admin.database.v1.RestoreSourceType[message.sourceType] : message.sourceType;
                                if (message.backupInfo != null && message.hasOwnProperty("backupInfo")) {
                                    object.backupInfo = $root.google.spanner.admin.database.v1.BackupInfo.toObject(message.backupInfo, options);
                                    if (options.oneofs)
                                        object.sourceInfo = "backupInfo";
                                }
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                if (message.optimizeDatabaseOperationName != null && message.hasOwnProperty("optimizeDatabaseOperationName"))
                                    object.optimizeDatabaseOperationName = message.optimizeDatabaseOperationName;
                                return object;
                            };
    
                            /**
                             * Converts this RestoreDatabaseMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            RestoreDatabaseMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for RestoreDatabaseMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.RestoreDatabaseMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            RestoreDatabaseMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.RestoreDatabaseMetadata";
                            };
    
                            return RestoreDatabaseMetadata;
                        })();
    
                        v1.OptimizeRestoredDatabaseMetadata = (function() {
    
                            /**
                             * Properties of an OptimizeRestoredDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IOptimizeRestoredDatabaseMetadata
                             * @property {string|null} [name] OptimizeRestoredDatabaseMetadata name
                             * @property {google.spanner.admin.database.v1.IOperationProgress|null} [progress] OptimizeRestoredDatabaseMetadata progress
                             */
    
                            /**
                             * Constructs a new OptimizeRestoredDatabaseMetadata.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an OptimizeRestoredDatabaseMetadata.
                             * @implements IOptimizeRestoredDatabaseMetadata
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IOptimizeRestoredDatabaseMetadata=} [properties] Properties to set
                             */
                            function OptimizeRestoredDatabaseMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * OptimizeRestoredDatabaseMetadata name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @instance
                             */
                            OptimizeRestoredDatabaseMetadata.prototype.name = "";
    
                            /**
                             * OptimizeRestoredDatabaseMetadata progress.
                             * @member {google.spanner.admin.database.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @instance
                             */
                            OptimizeRestoredDatabaseMetadata.prototype.progress = null;
    
                            /**
                             * Creates a new OptimizeRestoredDatabaseMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IOptimizeRestoredDatabaseMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata} OptimizeRestoredDatabaseMetadata instance
                             */
                            OptimizeRestoredDatabaseMetadata.create = function create(properties) {
                                return new OptimizeRestoredDatabaseMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified OptimizeRestoredDatabaseMetadata message. Does not implicitly {@link google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IOptimizeRestoredDatabaseMetadata} message OptimizeRestoredDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OptimizeRestoredDatabaseMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.database.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified OptimizeRestoredDatabaseMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.IOptimizeRestoredDatabaseMetadata} message OptimizeRestoredDatabaseMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OptimizeRestoredDatabaseMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an OptimizeRestoredDatabaseMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata} OptimizeRestoredDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OptimizeRestoredDatabaseMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.progress = $root.google.spanner.admin.database.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an OptimizeRestoredDatabaseMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata} OptimizeRestoredDatabaseMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OptimizeRestoredDatabaseMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an OptimizeRestoredDatabaseMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            OptimizeRestoredDatabaseMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.database.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an OptimizeRestoredDatabaseMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata} OptimizeRestoredDatabaseMetadata
                             */
                            OptimizeRestoredDatabaseMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.database.v1.OperationProgress.fromObject(object.progress);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an OptimizeRestoredDatabaseMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata} message OptimizeRestoredDatabaseMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            OptimizeRestoredDatabaseMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.progress = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.database.v1.OperationProgress.toObject(message.progress, options);
                                return object;
                            };
    
                            /**
                             * Converts this OptimizeRestoredDatabaseMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            OptimizeRestoredDatabaseMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for OptimizeRestoredDatabaseMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            OptimizeRestoredDatabaseMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata";
                            };
    
                            return OptimizeRestoredDatabaseMetadata;
                        })();
    
                        /**
                         * RestoreSourceType enum.
                         * @name google.spanner.admin.database.v1.RestoreSourceType
                         * @enum {number}
                         * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                         * @property {number} BACKUP=1 BACKUP value
                         */
                        v1.RestoreSourceType = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "BACKUP"] = 1;
                            return values;
                        })();
    
                        v1.DatabaseRole = (function() {
    
                            /**
                             * Properties of a DatabaseRole.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IDatabaseRole
                             * @property {string|null} [name] DatabaseRole name
                             */
    
                            /**
                             * Constructs a new DatabaseRole.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a DatabaseRole.
                             * @implements IDatabaseRole
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IDatabaseRole=} [properties] Properties to set
                             */
                            function DatabaseRole(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DatabaseRole name.
                             * @member {string} name
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @instance
                             */
                            DatabaseRole.prototype.name = "";
    
                            /**
                             * Creates a new DatabaseRole instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabaseRole=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.DatabaseRole} DatabaseRole instance
                             */
                            DatabaseRole.create = function create(properties) {
                                return new DatabaseRole(properties);
                            };
    
                            /**
                             * Encodes the specified DatabaseRole message. Does not implicitly {@link google.spanner.admin.database.v1.DatabaseRole.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabaseRole} message DatabaseRole message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DatabaseRole.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DatabaseRole message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.DatabaseRole.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {google.spanner.admin.database.v1.IDatabaseRole} message DatabaseRole message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DatabaseRole.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DatabaseRole message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.DatabaseRole} DatabaseRole
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DatabaseRole.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.DatabaseRole();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DatabaseRole message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.DatabaseRole} DatabaseRole
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DatabaseRole.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DatabaseRole message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DatabaseRole.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DatabaseRole message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.DatabaseRole} DatabaseRole
                             */
                            DatabaseRole.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.DatabaseRole)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.DatabaseRole();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DatabaseRole message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {google.spanner.admin.database.v1.DatabaseRole} message DatabaseRole
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DatabaseRole.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this DatabaseRole to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DatabaseRole.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DatabaseRole
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.DatabaseRole
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DatabaseRole.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.DatabaseRole";
                            };
    
                            return DatabaseRole;
                        })();
    
                        v1.ListDatabaseRolesRequest = (function() {
    
                            /**
                             * Properties of a ListDatabaseRolesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabaseRolesRequest
                             * @property {string|null} [parent] ListDatabaseRolesRequest parent
                             * @property {number|null} [pageSize] ListDatabaseRolesRequest pageSize
                             * @property {string|null} [pageToken] ListDatabaseRolesRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListDatabaseRolesRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabaseRolesRequest.
                             * @implements IListDatabaseRolesRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest=} [properties] Properties to set
                             */
                            function ListDatabaseRolesRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabaseRolesRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @instance
                             */
                            ListDatabaseRolesRequest.prototype.parent = "";
    
                            /**
                             * ListDatabaseRolesRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @instance
                             */
                            ListDatabaseRolesRequest.prototype.pageSize = 0;
    
                            /**
                             * ListDatabaseRolesRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @instance
                             */
                            ListDatabaseRolesRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListDatabaseRolesRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesRequest} ListDatabaseRolesRequest instance
                             */
                            ListDatabaseRolesRequest.create = function create(properties) {
                                return new ListDatabaseRolesRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabaseRolesRequest message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseRolesRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest} message ListDatabaseRolesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseRolesRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabaseRolesRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseRolesRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesRequest} message ListDatabaseRolesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseRolesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabaseRolesRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesRequest} ListDatabaseRolesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseRolesRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabaseRolesRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabaseRolesRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesRequest} ListDatabaseRolesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseRolesRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabaseRolesRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabaseRolesRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabaseRolesRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesRequest} ListDatabaseRolesRequest
                             */
                            ListDatabaseRolesRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabaseRolesRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabaseRolesRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabaseRolesRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabaseRolesRequest} message ListDatabaseRolesRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabaseRolesRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabaseRolesRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabaseRolesRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabaseRolesRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabaseRolesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabaseRolesRequest";
                            };
    
                            return ListDatabaseRolesRequest;
                        })();
    
                        v1.ListDatabaseRolesResponse = (function() {
    
                            /**
                             * Properties of a ListDatabaseRolesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IListDatabaseRolesResponse
                             * @property {Array.<google.spanner.admin.database.v1.IDatabaseRole>|null} [databaseRoles] ListDatabaseRolesResponse databaseRoles
                             * @property {string|null} [nextPageToken] ListDatabaseRolesResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListDatabaseRolesResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a ListDatabaseRolesResponse.
                             * @implements IListDatabaseRolesResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesResponse=} [properties] Properties to set
                             */
                            function ListDatabaseRolesResponse(properties) {
                                this.databaseRoles = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListDatabaseRolesResponse databaseRoles.
                             * @member {Array.<google.spanner.admin.database.v1.IDatabaseRole>} databaseRoles
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @instance
                             */
                            ListDatabaseRolesResponse.prototype.databaseRoles = $util.emptyArray;
    
                            /**
                             * ListDatabaseRolesResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @instance
                             */
                            ListDatabaseRolesResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListDatabaseRolesResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesResponse} ListDatabaseRolesResponse instance
                             */
                            ListDatabaseRolesResponse.create = function create(properties) {
                                return new ListDatabaseRolesResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListDatabaseRolesResponse message. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseRolesResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesResponse} message ListDatabaseRolesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseRolesResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.databaseRoles != null && message.databaseRoles.length)
                                    for (var i = 0; i < message.databaseRoles.length; ++i)
                                        $root.google.spanner.admin.database.v1.DatabaseRole.encode(message.databaseRoles[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListDatabaseRolesResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.ListDatabaseRolesResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IListDatabaseRolesResponse} message ListDatabaseRolesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListDatabaseRolesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListDatabaseRolesResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesResponse} ListDatabaseRolesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseRolesResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.ListDatabaseRolesResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.databaseRoles && message.databaseRoles.length))
                                                message.databaseRoles = [];
                                            message.databaseRoles.push($root.google.spanner.admin.database.v1.DatabaseRole.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListDatabaseRolesResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesResponse} ListDatabaseRolesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListDatabaseRolesResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListDatabaseRolesResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListDatabaseRolesResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.databaseRoles != null && message.hasOwnProperty("databaseRoles")) {
                                    if (!Array.isArray(message.databaseRoles))
                                        return "databaseRoles: array expected";
                                    for (var i = 0; i < message.databaseRoles.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.DatabaseRole.verify(message.databaseRoles[i]);
                                        if (error)
                                            return "databaseRoles." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListDatabaseRolesResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.ListDatabaseRolesResponse} ListDatabaseRolesResponse
                             */
                            ListDatabaseRolesResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.ListDatabaseRolesResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.ListDatabaseRolesResponse();
                                if (object.databaseRoles) {
                                    if (!Array.isArray(object.databaseRoles))
                                        throw TypeError(".google.spanner.admin.database.v1.ListDatabaseRolesResponse.databaseRoles: array expected");
                                    message.databaseRoles = [];
                                    for (var i = 0; i < object.databaseRoles.length; ++i) {
                                        if (typeof object.databaseRoles[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.ListDatabaseRolesResponse.databaseRoles: object expected");
                                        message.databaseRoles[i] = $root.google.spanner.admin.database.v1.DatabaseRole.fromObject(object.databaseRoles[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListDatabaseRolesResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.ListDatabaseRolesResponse} message ListDatabaseRolesResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListDatabaseRolesResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.databaseRoles = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.databaseRoles && message.databaseRoles.length) {
                                    object.databaseRoles = [];
                                    for (var j = 0; j < message.databaseRoles.length; ++j)
                                        object.databaseRoles[j] = $root.google.spanner.admin.database.v1.DatabaseRole.toObject(message.databaseRoles[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListDatabaseRolesResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListDatabaseRolesResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListDatabaseRolesResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.ListDatabaseRolesResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListDatabaseRolesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.ListDatabaseRolesResponse";
                            };
    
                            return ListDatabaseRolesResponse;
                        })();
    
                        v1.AddSplitPointsRequest = (function() {
    
                            /**
                             * Properties of an AddSplitPointsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IAddSplitPointsRequest
                             * @property {string|null} [database] AddSplitPointsRequest database
                             * @property {Array.<google.spanner.admin.database.v1.ISplitPoints>|null} [splitPoints] AddSplitPointsRequest splitPoints
                             * @property {string|null} [initiator] AddSplitPointsRequest initiator
                             */
    
                            /**
                             * Constructs a new AddSplitPointsRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an AddSplitPointsRequest.
                             * @implements IAddSplitPointsRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest=} [properties] Properties to set
                             */
                            function AddSplitPointsRequest(properties) {
                                this.splitPoints = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * AddSplitPointsRequest database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @instance
                             */
                            AddSplitPointsRequest.prototype.database = "";
    
                            /**
                             * AddSplitPointsRequest splitPoints.
                             * @member {Array.<google.spanner.admin.database.v1.ISplitPoints>} splitPoints
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @instance
                             */
                            AddSplitPointsRequest.prototype.splitPoints = $util.emptyArray;
    
                            /**
                             * AddSplitPointsRequest initiator.
                             * @member {string} initiator
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @instance
                             */
                            AddSplitPointsRequest.prototype.initiator = "";
    
                            /**
                             * Creates a new AddSplitPointsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsRequest} AddSplitPointsRequest instance
                             */
                            AddSplitPointsRequest.create = function create(properties) {
                                return new AddSplitPointsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified AddSplitPointsRequest message. Does not implicitly {@link google.spanner.admin.database.v1.AddSplitPointsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest} message AddSplitPointsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AddSplitPointsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                if (message.splitPoints != null && message.splitPoints.length)
                                    for (var i = 0; i < message.splitPoints.length; ++i)
                                        $root.google.spanner.admin.database.v1.SplitPoints.encode(message.splitPoints[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.initiator != null && Object.hasOwnProperty.call(message, "initiator"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.initiator);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified AddSplitPointsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.AddSplitPointsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsRequest} message AddSplitPointsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AddSplitPointsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an AddSplitPointsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsRequest} AddSplitPointsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AddSplitPointsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.AddSplitPointsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.splitPoints && message.splitPoints.length))
                                                message.splitPoints = [];
                                            message.splitPoints.push($root.google.spanner.admin.database.v1.SplitPoints.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 3: {
                                            message.initiator = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an AddSplitPointsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsRequest} AddSplitPointsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AddSplitPointsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an AddSplitPointsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            AddSplitPointsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.splitPoints != null && message.hasOwnProperty("splitPoints")) {
                                    if (!Array.isArray(message.splitPoints))
                                        return "splitPoints: array expected";
                                    for (var i = 0; i < message.splitPoints.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.SplitPoints.verify(message.splitPoints[i]);
                                        if (error)
                                            return "splitPoints." + error;
                                    }
                                }
                                if (message.initiator != null && message.hasOwnProperty("initiator"))
                                    if (!$util.isString(message.initiator))
                                        return "initiator: string expected";
                                return null;
                            };
    
                            /**
                             * Creates an AddSplitPointsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsRequest} AddSplitPointsRequest
                             */
                            AddSplitPointsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.AddSplitPointsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.AddSplitPointsRequest();
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.splitPoints) {
                                    if (!Array.isArray(object.splitPoints))
                                        throw TypeError(".google.spanner.admin.database.v1.AddSplitPointsRequest.splitPoints: array expected");
                                    message.splitPoints = [];
                                    for (var i = 0; i < object.splitPoints.length; ++i) {
                                        if (typeof object.splitPoints[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.AddSplitPointsRequest.splitPoints: object expected");
                                        message.splitPoints[i] = $root.google.spanner.admin.database.v1.SplitPoints.fromObject(object.splitPoints[i]);
                                    }
                                }
                                if (object.initiator != null)
                                    message.initiator = String(object.initiator);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an AddSplitPointsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.AddSplitPointsRequest} message AddSplitPointsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            AddSplitPointsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.splitPoints = [];
                                if (options.defaults) {
                                    object.database = "";
                                    object.initiator = "";
                                }
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.splitPoints && message.splitPoints.length) {
                                    object.splitPoints = [];
                                    for (var j = 0; j < message.splitPoints.length; ++j)
                                        object.splitPoints[j] = $root.google.spanner.admin.database.v1.SplitPoints.toObject(message.splitPoints[j], options);
                                }
                                if (message.initiator != null && message.hasOwnProperty("initiator"))
                                    object.initiator = message.initiator;
                                return object;
                            };
    
                            /**
                             * Converts this AddSplitPointsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            AddSplitPointsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for AddSplitPointsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            AddSplitPointsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.AddSplitPointsRequest";
                            };
    
                            return AddSplitPointsRequest;
                        })();
    
                        v1.AddSplitPointsResponse = (function() {
    
                            /**
                             * Properties of an AddSplitPointsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IAddSplitPointsResponse
                             */
    
                            /**
                             * Constructs a new AddSplitPointsResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an AddSplitPointsResponse.
                             * @implements IAddSplitPointsResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsResponse=} [properties] Properties to set
                             */
                            function AddSplitPointsResponse(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Creates a new AddSplitPointsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsResponse} AddSplitPointsResponse instance
                             */
                            AddSplitPointsResponse.create = function create(properties) {
                                return new AddSplitPointsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified AddSplitPointsResponse message. Does not implicitly {@link google.spanner.admin.database.v1.AddSplitPointsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsResponse} message AddSplitPointsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AddSplitPointsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified AddSplitPointsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.AddSplitPointsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IAddSplitPointsResponse} message AddSplitPointsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AddSplitPointsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an AddSplitPointsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsResponse} AddSplitPointsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AddSplitPointsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.AddSplitPointsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an AddSplitPointsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsResponse} AddSplitPointsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AddSplitPointsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an AddSplitPointsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            AddSplitPointsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                return null;
                            };
    
                            /**
                             * Creates an AddSplitPointsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.AddSplitPointsResponse} AddSplitPointsResponse
                             */
                            AddSplitPointsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.AddSplitPointsResponse)
                                    return object;
                                return new $root.google.spanner.admin.database.v1.AddSplitPointsResponse();
                            };
    
                            /**
                             * Creates a plain object from an AddSplitPointsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.AddSplitPointsResponse} message AddSplitPointsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            AddSplitPointsResponse.toObject = function toObject() {
                                return {};
                            };
    
                            /**
                             * Converts this AddSplitPointsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            AddSplitPointsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for AddSplitPointsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.AddSplitPointsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            AddSplitPointsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.AddSplitPointsResponse";
                            };
    
                            return AddSplitPointsResponse;
                        })();
    
                        v1.SplitPoints = (function() {
    
                            /**
                             * Properties of a SplitPoints.
                             * @memberof google.spanner.admin.database.v1
                             * @interface ISplitPoints
                             * @property {string|null} [table] SplitPoints table
                             * @property {string|null} [index] SplitPoints index
                             * @property {Array.<google.spanner.admin.database.v1.SplitPoints.IKey>|null} [keys] SplitPoints keys
                             * @property {google.protobuf.ITimestamp|null} [expireTime] SplitPoints expireTime
                             */
    
                            /**
                             * Constructs a new SplitPoints.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents a SplitPoints.
                             * @implements ISplitPoints
                             * @constructor
                             * @param {google.spanner.admin.database.v1.ISplitPoints=} [properties] Properties to set
                             */
                            function SplitPoints(properties) {
                                this.keys = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * SplitPoints table.
                             * @member {string} table
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @instance
                             */
                            SplitPoints.prototype.table = "";
    
                            /**
                             * SplitPoints index.
                             * @member {string} index
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @instance
                             */
                            SplitPoints.prototype.index = "";
    
                            /**
                             * SplitPoints keys.
                             * @member {Array.<google.spanner.admin.database.v1.SplitPoints.IKey>} keys
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @instance
                             */
                            SplitPoints.prototype.keys = $util.emptyArray;
    
                            /**
                             * SplitPoints expireTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @instance
                             */
                            SplitPoints.prototype.expireTime = null;
    
                            /**
                             * Creates a new SplitPoints instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {google.spanner.admin.database.v1.ISplitPoints=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.SplitPoints} SplitPoints instance
                             */
                            SplitPoints.create = function create(properties) {
                                return new SplitPoints(properties);
                            };
    
                            /**
                             * Encodes the specified SplitPoints message. Does not implicitly {@link google.spanner.admin.database.v1.SplitPoints.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {google.spanner.admin.database.v1.ISplitPoints} message SplitPoints message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            SplitPoints.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                                if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.index);
                                if (message.keys != null && message.keys.length)
                                    for (var i = 0; i < message.keys.length; ++i)
                                        $root.google.spanner.admin.database.v1.SplitPoints.Key.encode(message.keys[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                    $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified SplitPoints message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.SplitPoints.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {google.spanner.admin.database.v1.ISplitPoints} message SplitPoints message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            SplitPoints.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a SplitPoints message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.SplitPoints} SplitPoints
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            SplitPoints.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.SplitPoints();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.table = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.index = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.keys && message.keys.length))
                                                message.keys = [];
                                            message.keys.push($root.google.spanner.admin.database.v1.SplitPoints.Key.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 5: {
                                            message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a SplitPoints message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.SplitPoints} SplitPoints
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            SplitPoints.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a SplitPoints message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            SplitPoints.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.table != null && message.hasOwnProperty("table"))
                                    if (!$util.isString(message.table))
                                        return "table: string expected";
                                if (message.index != null && message.hasOwnProperty("index"))
                                    if (!$util.isString(message.index))
                                        return "index: string expected";
                                if (message.keys != null && message.hasOwnProperty("keys")) {
                                    if (!Array.isArray(message.keys))
                                        return "keys: array expected";
                                    for (var i = 0; i < message.keys.length; ++i) {
                                        var error = $root.google.spanner.admin.database.v1.SplitPoints.Key.verify(message.keys[i]);
                                        if (error)
                                            return "keys." + error;
                                    }
                                }
                                if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                    if (error)
                                        return "expireTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a SplitPoints message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.SplitPoints} SplitPoints
                             */
                            SplitPoints.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.SplitPoints)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.SplitPoints();
                                if (object.table != null)
                                    message.table = String(object.table);
                                if (object.index != null)
                                    message.index = String(object.index);
                                if (object.keys) {
                                    if (!Array.isArray(object.keys))
                                        throw TypeError(".google.spanner.admin.database.v1.SplitPoints.keys: array expected");
                                    message.keys = [];
                                    for (var i = 0; i < object.keys.length; ++i) {
                                        if (typeof object.keys[i] !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.SplitPoints.keys: object expected");
                                        message.keys[i] = $root.google.spanner.admin.database.v1.SplitPoints.Key.fromObject(object.keys[i]);
                                    }
                                }
                                if (object.expireTime != null) {
                                    if (typeof object.expireTime !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.SplitPoints.expireTime: object expected");
                                    message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a SplitPoints message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {google.spanner.admin.database.v1.SplitPoints} message SplitPoints
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            SplitPoints.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.keys = [];
                                if (options.defaults) {
                                    object.table = "";
                                    object.index = "";
                                    object.expireTime = null;
                                }
                                if (message.table != null && message.hasOwnProperty("table"))
                                    object.table = message.table;
                                if (message.index != null && message.hasOwnProperty("index"))
                                    object.index = message.index;
                                if (message.keys && message.keys.length) {
                                    object.keys = [];
                                    for (var j = 0; j < message.keys.length; ++j)
                                        object.keys[j] = $root.google.spanner.admin.database.v1.SplitPoints.Key.toObject(message.keys[j], options);
                                }
                                if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                    object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this SplitPoints to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            SplitPoints.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for SplitPoints
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.SplitPoints
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            SplitPoints.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.SplitPoints";
                            };
    
                            SplitPoints.Key = (function() {
    
                                /**
                                 * Properties of a Key.
                                 * @memberof google.spanner.admin.database.v1.SplitPoints
                                 * @interface IKey
                                 * @property {google.protobuf.IListValue|null} [keyParts] Key keyParts
                                 */
    
                                /**
                                 * Constructs a new Key.
                                 * @memberof google.spanner.admin.database.v1.SplitPoints
                                 * @classdesc Represents a Key.
                                 * @implements IKey
                                 * @constructor
                                 * @param {google.spanner.admin.database.v1.SplitPoints.IKey=} [properties] Properties to set
                                 */
                                function Key(properties) {
                                    if (properties)
                                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                            if (properties[keys[i]] != null)
                                                this[keys[i]] = properties[keys[i]];
                                }
    
                                /**
                                 * Key keyParts.
                                 * @member {google.protobuf.IListValue|null|undefined} keyParts
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @instance
                                 */
                                Key.prototype.keyParts = null;
    
                                /**
                                 * Creates a new Key instance using the specified properties.
                                 * @function create
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {google.spanner.admin.database.v1.SplitPoints.IKey=} [properties] Properties to set
                                 * @returns {google.spanner.admin.database.v1.SplitPoints.Key} Key instance
                                 */
                                Key.create = function create(properties) {
                                    return new Key(properties);
                                };
    
                                /**
                                 * Encodes the specified Key message. Does not implicitly {@link google.spanner.admin.database.v1.SplitPoints.Key.verify|verify} messages.
                                 * @function encode
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {google.spanner.admin.database.v1.SplitPoints.IKey} message Key message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                Key.encode = function encode(message, writer) {
                                    if (!writer)
                                        writer = $Writer.create();
                                    if (message.keyParts != null && Object.hasOwnProperty.call(message, "keyParts"))
                                        $root.google.protobuf.ListValue.encode(message.keyParts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                    return writer;
                                };
    
                                /**
                                 * Encodes the specified Key message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.SplitPoints.Key.verify|verify} messages.
                                 * @function encodeDelimited
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {google.spanner.admin.database.v1.SplitPoints.IKey} message Key message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                Key.encodeDelimited = function encodeDelimited(message, writer) {
                                    return this.encode(message, writer).ldelim();
                                };
    
                                /**
                                 * Decodes a Key message from the specified reader or buffer.
                                 * @function decode
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @param {number} [length] Message length if known beforehand
                                 * @returns {google.spanner.admin.database.v1.SplitPoints.Key} Key
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                Key.decode = function decode(reader, length, error) {
                                    if (!(reader instanceof $Reader))
                                        reader = $Reader.create(reader);
                                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.SplitPoints.Key();
                                    while (reader.pos < end) {
                                        var tag = reader.uint32();
                                        if (tag === error)
                                            break;
                                        switch (tag >>> 3) {
                                        case 1: {
                                                message.keyParts = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                                break;
                                            }
                                        default:
                                            reader.skipType(tag & 7);
                                            break;
                                        }
                                    }
                                    return message;
                                };
    
                                /**
                                 * Decodes a Key message from the specified reader or buffer, length delimited.
                                 * @function decodeDelimited
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @returns {google.spanner.admin.database.v1.SplitPoints.Key} Key
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                Key.decodeDelimited = function decodeDelimited(reader) {
                                    if (!(reader instanceof $Reader))
                                        reader = new $Reader(reader);
                                    return this.decode(reader, reader.uint32());
                                };
    
                                /**
                                 * Verifies a Key message.
                                 * @function verify
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {Object.<string,*>} message Plain object to verify
                                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                                 */
                                Key.verify = function verify(message) {
                                    if (typeof message !== "object" || message === null)
                                        return "object expected";
                                    if (message.keyParts != null && message.hasOwnProperty("keyParts")) {
                                        var error = $root.google.protobuf.ListValue.verify(message.keyParts);
                                        if (error)
                                            return "keyParts." + error;
                                    }
                                    return null;
                                };
    
                                /**
                                 * Creates a Key message from a plain object. Also converts values to their respective internal types.
                                 * @function fromObject
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {Object.<string,*>} object Plain object
                                 * @returns {google.spanner.admin.database.v1.SplitPoints.Key} Key
                                 */
                                Key.fromObject = function fromObject(object) {
                                    if (object instanceof $root.google.spanner.admin.database.v1.SplitPoints.Key)
                                        return object;
                                    var message = new $root.google.spanner.admin.database.v1.SplitPoints.Key();
                                    if (object.keyParts != null) {
                                        if (typeof object.keyParts !== "object")
                                            throw TypeError(".google.spanner.admin.database.v1.SplitPoints.Key.keyParts: object expected");
                                        message.keyParts = $root.google.protobuf.ListValue.fromObject(object.keyParts);
                                    }
                                    return message;
                                };
    
                                /**
                                 * Creates a plain object from a Key message. Also converts values to other types if specified.
                                 * @function toObject
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {google.spanner.admin.database.v1.SplitPoints.Key} message Key
                                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                                 * @returns {Object.<string,*>} Plain object
                                 */
                                Key.toObject = function toObject(message, options) {
                                    if (!options)
                                        options = {};
                                    var object = {};
                                    if (options.defaults)
                                        object.keyParts = null;
                                    if (message.keyParts != null && message.hasOwnProperty("keyParts"))
                                        object.keyParts = $root.google.protobuf.ListValue.toObject(message.keyParts, options);
                                    return object;
                                };
    
                                /**
                                 * Converts this Key to JSON.
                                 * @function toJSON
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @instance
                                 * @returns {Object.<string,*>} JSON object
                                 */
                                Key.prototype.toJSON = function toJSON() {
                                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                                };
    
                                /**
                                 * Gets the default type url for Key
                                 * @function getTypeUrl
                                 * @memberof google.spanner.admin.database.v1.SplitPoints.Key
                                 * @static
                                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                                 * @returns {string} The default type url
                                 */
                                Key.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                    if (typeUrlPrefix === undefined) {
                                        typeUrlPrefix = "type.googleapis.com";
                                    }
                                    return typeUrlPrefix + "/google.spanner.admin.database.v1.SplitPoints.Key";
                                };
    
                                return Key;
                            })();
    
                            return SplitPoints;
                        })();
    
                        v1.InternalUpdateGraphOperationRequest = (function() {
    
                            /**
                             * Properties of an InternalUpdateGraphOperationRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IInternalUpdateGraphOperationRequest
                             * @property {string|null} [database] InternalUpdateGraphOperationRequest database
                             * @property {string|null} [operationId] InternalUpdateGraphOperationRequest operationId
                             * @property {string|null} [vmIdentityToken] InternalUpdateGraphOperationRequest vmIdentityToken
                             * @property {number|null} [progress] InternalUpdateGraphOperationRequest progress
                             * @property {google.rpc.IStatus|null} [status] InternalUpdateGraphOperationRequest status
                             */
    
                            /**
                             * Constructs a new InternalUpdateGraphOperationRequest.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an InternalUpdateGraphOperationRequest.
                             * @implements IInternalUpdateGraphOperationRequest
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest=} [properties] Properties to set
                             */
                            function InternalUpdateGraphOperationRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * InternalUpdateGraphOperationRequest database.
                             * @member {string} database
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             */
                            InternalUpdateGraphOperationRequest.prototype.database = "";
    
                            /**
                             * InternalUpdateGraphOperationRequest operationId.
                             * @member {string} operationId
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             */
                            InternalUpdateGraphOperationRequest.prototype.operationId = "";
    
                            /**
                             * InternalUpdateGraphOperationRequest vmIdentityToken.
                             * @member {string} vmIdentityToken
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             */
                            InternalUpdateGraphOperationRequest.prototype.vmIdentityToken = "";
    
                            /**
                             * InternalUpdateGraphOperationRequest progress.
                             * @member {number} progress
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             */
                            InternalUpdateGraphOperationRequest.prototype.progress = 0;
    
                            /**
                             * InternalUpdateGraphOperationRequest status.
                             * @member {google.rpc.IStatus|null|undefined} status
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             */
                            InternalUpdateGraphOperationRequest.prototype.status = null;
    
                            /**
                             * Creates a new InternalUpdateGraphOperationRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest} InternalUpdateGraphOperationRequest instance
                             */
                            InternalUpdateGraphOperationRequest.create = function create(properties) {
                                return new InternalUpdateGraphOperationRequest(properties);
                            };
    
                            /**
                             * Encodes the specified InternalUpdateGraphOperationRequest message. Does not implicitly {@link google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest} message InternalUpdateGraphOperationRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InternalUpdateGraphOperationRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                                if (message.operationId != null && Object.hasOwnProperty.call(message, "operationId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.operationId);
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    writer.uint32(/* id 3, wireType 1 =*/25).double(message.progress);
                                if (message.vmIdentityToken != null && Object.hasOwnProperty.call(message, "vmIdentityToken"))
                                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.vmIdentityToken);
                                if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                                    $root.google.rpc.Status.encode(message.status, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified InternalUpdateGraphOperationRequest message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationRequest} message InternalUpdateGraphOperationRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InternalUpdateGraphOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an InternalUpdateGraphOperationRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest} InternalUpdateGraphOperationRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InternalUpdateGraphOperationRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.database = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.operationId = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.vmIdentityToken = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.progress = reader.double();
                                            break;
                                        }
                                    case 6: {
                                            message.status = $root.google.rpc.Status.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an InternalUpdateGraphOperationRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest} InternalUpdateGraphOperationRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InternalUpdateGraphOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an InternalUpdateGraphOperationRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            InternalUpdateGraphOperationRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.database != null && message.hasOwnProperty("database"))
                                    if (!$util.isString(message.database))
                                        return "database: string expected";
                                if (message.operationId != null && message.hasOwnProperty("operationId"))
                                    if (!$util.isString(message.operationId))
                                        return "operationId: string expected";
                                if (message.vmIdentityToken != null && message.hasOwnProperty("vmIdentityToken"))
                                    if (!$util.isString(message.vmIdentityToken))
                                        return "vmIdentityToken: string expected";
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    if (typeof message.progress !== "number")
                                        return "progress: number expected";
                                if (message.status != null && message.hasOwnProperty("status")) {
                                    var error = $root.google.rpc.Status.verify(message.status);
                                    if (error)
                                        return "status." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an InternalUpdateGraphOperationRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest} InternalUpdateGraphOperationRequest
                             */
                            InternalUpdateGraphOperationRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest();
                                if (object.database != null)
                                    message.database = String(object.database);
                                if (object.operationId != null)
                                    message.operationId = String(object.operationId);
                                if (object.vmIdentityToken != null)
                                    message.vmIdentityToken = String(object.vmIdentityToken);
                                if (object.progress != null)
                                    message.progress = Number(object.progress);
                                if (object.status != null) {
                                    if (typeof object.status !== "object")
                                        throw TypeError(".google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest.status: object expected");
                                    message.status = $root.google.rpc.Status.fromObject(object.status);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an InternalUpdateGraphOperationRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest} message InternalUpdateGraphOperationRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            InternalUpdateGraphOperationRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.database = "";
                                    object.operationId = "";
                                    object.progress = 0;
                                    object.vmIdentityToken = "";
                                    object.status = null;
                                }
                                if (message.database != null && message.hasOwnProperty("database"))
                                    object.database = message.database;
                                if (message.operationId != null && message.hasOwnProperty("operationId"))
                                    object.operationId = message.operationId;
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = options.json && !isFinite(message.progress) ? String(message.progress) : message.progress;
                                if (message.vmIdentityToken != null && message.hasOwnProperty("vmIdentityToken"))
                                    object.vmIdentityToken = message.vmIdentityToken;
                                if (message.status != null && message.hasOwnProperty("status"))
                                    object.status = $root.google.rpc.Status.toObject(message.status, options);
                                return object;
                            };
    
                            /**
                             * Converts this InternalUpdateGraphOperationRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            InternalUpdateGraphOperationRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for InternalUpdateGraphOperationRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            InternalUpdateGraphOperationRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.InternalUpdateGraphOperationRequest";
                            };
    
                            return InternalUpdateGraphOperationRequest;
                        })();
    
                        v1.InternalUpdateGraphOperationResponse = (function() {
    
                            /**
                             * Properties of an InternalUpdateGraphOperationResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @interface IInternalUpdateGraphOperationResponse
                             */
    
                            /**
                             * Constructs a new InternalUpdateGraphOperationResponse.
                             * @memberof google.spanner.admin.database.v1
                             * @classdesc Represents an InternalUpdateGraphOperationResponse.
                             * @implements IInternalUpdateGraphOperationResponse
                             * @constructor
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationResponse=} [properties] Properties to set
                             */
                            function InternalUpdateGraphOperationResponse(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Creates a new InternalUpdateGraphOperationResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} InternalUpdateGraphOperationResponse instance
                             */
                            InternalUpdateGraphOperationResponse.create = function create(properties) {
                                return new InternalUpdateGraphOperationResponse(properties);
                            };
    
                            /**
                             * Encodes the specified InternalUpdateGraphOperationResponse message. Does not implicitly {@link google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationResponse} message InternalUpdateGraphOperationResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InternalUpdateGraphOperationResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified InternalUpdateGraphOperationResponse message, length delimited. Does not implicitly {@link google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.IInternalUpdateGraphOperationResponse} message InternalUpdateGraphOperationResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InternalUpdateGraphOperationResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an InternalUpdateGraphOperationResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} InternalUpdateGraphOperationResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InternalUpdateGraphOperationResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an InternalUpdateGraphOperationResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} InternalUpdateGraphOperationResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InternalUpdateGraphOperationResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an InternalUpdateGraphOperationResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            InternalUpdateGraphOperationResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                return null;
                            };
    
                            /**
                             * Creates an InternalUpdateGraphOperationResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} InternalUpdateGraphOperationResponse
                             */
                            InternalUpdateGraphOperationResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse)
                                    return object;
                                return new $root.google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse();
                            };
    
                            /**
                             * Creates a plain object from an InternalUpdateGraphOperationResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse} message InternalUpdateGraphOperationResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            InternalUpdateGraphOperationResponse.toObject = function toObject() {
                                return {};
                            };
    
                            /**
                             * Converts this InternalUpdateGraphOperationResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            InternalUpdateGraphOperationResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for InternalUpdateGraphOperationResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            InternalUpdateGraphOperationResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.database.v1.InternalUpdateGraphOperationResponse";
                            };
    
                            return InternalUpdateGraphOperationResponse;
                        })();
    
                        return v1;
                    })();
    
                    return database;
                })();
    
                admin.instance = (function() {
    
                    /**
                     * Namespace instance.
                     * @memberof google.spanner.admin
                     * @namespace
                     */
                    var instance = {};
    
                    instance.v1 = (function() {
    
                        /**
                         * Namespace v1.
                         * @memberof google.spanner.admin.instance
                         * @namespace
                         */
                        var v1 = {};
    
                        v1.OperationProgress = (function() {
    
                            /**
                             * Properties of an OperationProgress.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IOperationProgress
                             * @property {number|null} [progressPercent] OperationProgress progressPercent
                             * @property {google.protobuf.ITimestamp|null} [startTime] OperationProgress startTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] OperationProgress endTime
                             */
    
                            /**
                             * Constructs a new OperationProgress.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an OperationProgress.
                             * @implements IOperationProgress
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IOperationProgress=} [properties] Properties to set
                             */
                            function OperationProgress(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * OperationProgress progressPercent.
                             * @member {number} progressPercent
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.progressPercent = 0;
    
                            /**
                             * OperationProgress startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.startTime = null;
    
                            /**
                             * OperationProgress endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @instance
                             */
                            OperationProgress.prototype.endTime = null;
    
                            /**
                             * Creates a new OperationProgress instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.instance.v1.IOperationProgress=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.OperationProgress} OperationProgress instance
                             */
                            OperationProgress.create = function create(properties) {
                                return new OperationProgress(properties);
                            };
    
                            /**
                             * Encodes the specified OperationProgress message. Does not implicitly {@link google.spanner.admin.instance.v1.OperationProgress.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.instance.v1.IOperationProgress} message OperationProgress message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OperationProgress.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.progressPercent != null && Object.hasOwnProperty.call(message, "progressPercent"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.progressPercent);
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified OperationProgress message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.OperationProgress.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.instance.v1.IOperationProgress} message OperationProgress message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            OperationProgress.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an OperationProgress message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.OperationProgress} OperationProgress
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OperationProgress.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.OperationProgress();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.progressPercent = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an OperationProgress message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.OperationProgress} OperationProgress
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            OperationProgress.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an OperationProgress message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            OperationProgress.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.progressPercent != null && message.hasOwnProperty("progressPercent"))
                                    if (!$util.isInteger(message.progressPercent))
                                        return "progressPercent: integer expected";
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an OperationProgress message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.OperationProgress} OperationProgress
                             */
                            OperationProgress.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.OperationProgress)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.OperationProgress();
                                if (object.progressPercent != null)
                                    message.progressPercent = object.progressPercent | 0;
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.OperationProgress.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.OperationProgress.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an OperationProgress message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {google.spanner.admin.instance.v1.OperationProgress} message OperationProgress
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            OperationProgress.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.progressPercent = 0;
                                    object.startTime = null;
                                    object.endTime = null;
                                }
                                if (message.progressPercent != null && message.hasOwnProperty("progressPercent"))
                                    object.progressPercent = message.progressPercent;
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this OperationProgress to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            OperationProgress.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for OperationProgress
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.OperationProgress
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            OperationProgress.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.OperationProgress";
                            };
    
                            return OperationProgress;
                        })();
    
                        /**
                         * FulfillmentPeriod enum.
                         * @name google.spanner.admin.instance.v1.FulfillmentPeriod
                         * @enum {number}
                         * @property {number} FULFILLMENT_PERIOD_UNSPECIFIED=0 FULFILLMENT_PERIOD_UNSPECIFIED value
                         * @property {number} FULFILLMENT_PERIOD_NORMAL=1 FULFILLMENT_PERIOD_NORMAL value
                         * @property {number} FULFILLMENT_PERIOD_EXTENDED=2 FULFILLMENT_PERIOD_EXTENDED value
                         */
                        v1.FulfillmentPeriod = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "FULFILLMENT_PERIOD_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "FULFILLMENT_PERIOD_NORMAL"] = 1;
                            values[valuesById[2] = "FULFILLMENT_PERIOD_EXTENDED"] = 2;
                            return values;
                        })();
    
                        v1.ReplicaSelection = (function() {
    
                            /**
                             * Properties of a ReplicaSelection.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IReplicaSelection
                             * @property {string|null} [location] ReplicaSelection location
                             */
    
                            /**
                             * Constructs a new ReplicaSelection.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ReplicaSelection.
                             * @implements IReplicaSelection
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IReplicaSelection=} [properties] Properties to set
                             */
                            function ReplicaSelection(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ReplicaSelection location.
                             * @member {string} location
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @instance
                             */
                            ReplicaSelection.prototype.location = "";
    
                            /**
                             * Creates a new ReplicaSelection instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaSelection=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ReplicaSelection} ReplicaSelection instance
                             */
                            ReplicaSelection.create = function create(properties) {
                                return new ReplicaSelection(properties);
                            };
    
                            /**
                             * Encodes the specified ReplicaSelection message. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaSelection.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaSelection} message ReplicaSelection message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaSelection.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.location);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ReplicaSelection message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaSelection.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaSelection} message ReplicaSelection message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaSelection.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ReplicaSelection message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ReplicaSelection} ReplicaSelection
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaSelection.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ReplicaSelection();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.location = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ReplicaSelection message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ReplicaSelection} ReplicaSelection
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaSelection.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ReplicaSelection message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ReplicaSelection.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.location != null && message.hasOwnProperty("location"))
                                    if (!$util.isString(message.location))
                                        return "location: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ReplicaSelection message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ReplicaSelection} ReplicaSelection
                             */
                            ReplicaSelection.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ReplicaSelection)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ReplicaSelection();
                                if (object.location != null)
                                    message.location = String(object.location);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ReplicaSelection message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {google.spanner.admin.instance.v1.ReplicaSelection} message ReplicaSelection
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ReplicaSelection.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.location = "";
                                if (message.location != null && message.hasOwnProperty("location"))
                                    object.location = message.location;
                                return object;
                            };
    
                            /**
                             * Converts this ReplicaSelection to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ReplicaSelection.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ReplicaSelection
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ReplicaSelection
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ReplicaSelection.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ReplicaSelection";
                            };
    
                            return ReplicaSelection;
                        })();
    
                        v1.InstanceAdmin = (function() {
    
                            /**
                             * Constructs a new InstanceAdmin service.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an InstanceAdmin
                             * @extends $protobuf.rpc.Service
                             * @constructor
                             * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                             * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                             * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                             */
                            function InstanceAdmin(rpcImpl, requestDelimited, responseDelimited) {
                                $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                            }
    
                            (InstanceAdmin.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = InstanceAdmin;
    
                            /**
                             * Creates new InstanceAdmin service using the specified rpc implementation.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @static
                             * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                             * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                             * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                             * @returns {InstanceAdmin} RPC service. Useful where requests and/or responses are streamed.
                             */
                            InstanceAdmin.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                                return new this(rpcImpl, requestDelimited, responseDelimited);
                            };
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|listInstanceConfigs}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef ListInstanceConfigsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} [response] ListInstanceConfigsResponse
                             */
    
                            /**
                             * Calls ListInstanceConfigs.
                             * @function listInstanceConfigs
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest} request ListInstanceConfigsRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigsCallback} callback Node-style callback called with the error, if any, and ListInstanceConfigsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.listInstanceConfigs = function listInstanceConfigs(request, callback) {
                                return this.rpcCall(listInstanceConfigs, $root.google.spanner.admin.instance.v1.ListInstanceConfigsRequest, $root.google.spanner.admin.instance.v1.ListInstanceConfigsResponse, request, callback);
                            }, "name", { value: "ListInstanceConfigs" });
    
                            /**
                             * Calls ListInstanceConfigs.
                             * @function listInstanceConfigs
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest} request ListInstanceConfigsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.ListInstanceConfigsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|getInstanceConfig}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef GetInstanceConfigCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.InstanceConfig} [response] InstanceConfig
                             */
    
                            /**
                             * Calls GetInstanceConfig.
                             * @function getInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest} request GetInstanceConfigRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.GetInstanceConfigCallback} callback Node-style callback called with the error, if any, and InstanceConfig
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.getInstanceConfig = function getInstanceConfig(request, callback) {
                                return this.rpcCall(getInstanceConfig, $root.google.spanner.admin.instance.v1.GetInstanceConfigRequest, $root.google.spanner.admin.instance.v1.InstanceConfig, request, callback);
                            }, "name", { value: "GetInstanceConfig" });
    
                            /**
                             * Calls GetInstanceConfig.
                             * @function getInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest} request GetInstanceConfigRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.InstanceConfig>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|createInstanceConfig}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef CreateInstanceConfigCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CreateInstanceConfig.
                             * @function createInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest} request CreateInstanceConfigRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.CreateInstanceConfigCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.createInstanceConfig = function createInstanceConfig(request, callback) {
                                return this.rpcCall(createInstanceConfig, $root.google.spanner.admin.instance.v1.CreateInstanceConfigRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CreateInstanceConfig" });
    
                            /**
                             * Calls CreateInstanceConfig.
                             * @function createInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest} request CreateInstanceConfigRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|updateInstanceConfig}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef UpdateInstanceConfigCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls UpdateInstanceConfig.
                             * @function updateInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest} request UpdateInstanceConfigRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstanceConfigCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.updateInstanceConfig = function updateInstanceConfig(request, callback) {
                                return this.rpcCall(updateInstanceConfig, $root.google.spanner.admin.instance.v1.UpdateInstanceConfigRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "UpdateInstanceConfig" });
    
                            /**
                             * Calls UpdateInstanceConfig.
                             * @function updateInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest} request UpdateInstanceConfigRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|deleteInstanceConfig}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef DeleteInstanceConfigCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DeleteInstanceConfig.
                             * @function deleteInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest} request DeleteInstanceConfigRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstanceConfigCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.deleteInstanceConfig = function deleteInstanceConfig(request, callback) {
                                return this.rpcCall(deleteInstanceConfig, $root.google.spanner.admin.instance.v1.DeleteInstanceConfigRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DeleteInstanceConfig" });
    
                            /**
                             * Calls DeleteInstanceConfig.
                             * @function deleteInstanceConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest} request DeleteInstanceConfigRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|listInstanceConfigOperations}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef ListInstanceConfigOperationsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} [response] ListInstanceConfigOperationsResponse
                             */
    
                            /**
                             * Calls ListInstanceConfigOperations.
                             * @function listInstanceConfigOperations
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest} request ListInstanceConfigOperationsRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigOperationsCallback} callback Node-style callback called with the error, if any, and ListInstanceConfigOperationsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.listInstanceConfigOperations = function listInstanceConfigOperations(request, callback) {
                                return this.rpcCall(listInstanceConfigOperations, $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest, $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse, request, callback);
                            }, "name", { value: "ListInstanceConfigOperations" });
    
                            /**
                             * Calls ListInstanceConfigOperations.
                             * @function listInstanceConfigOperations
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest} request ListInstanceConfigOperationsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|listInstances}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef ListInstancesCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.ListInstancesResponse} [response] ListInstancesResponse
                             */
    
                            /**
                             * Calls ListInstances.
                             * @function listInstances
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest} request ListInstancesRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.ListInstancesCallback} callback Node-style callback called with the error, if any, and ListInstancesResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.listInstances = function listInstances(request, callback) {
                                return this.rpcCall(listInstances, $root.google.spanner.admin.instance.v1.ListInstancesRequest, $root.google.spanner.admin.instance.v1.ListInstancesResponse, request, callback);
                            }, "name", { value: "ListInstances" });
    
                            /**
                             * Calls ListInstances.
                             * @function listInstances
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest} request ListInstancesRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.ListInstancesResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|listInstancePartitions}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef ListInstancePartitionsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} [response] ListInstancePartitionsResponse
                             */
    
                            /**
                             * Calls ListInstancePartitions.
                             * @function listInstancePartitions
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest} request ListInstancePartitionsRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.ListInstancePartitionsCallback} callback Node-style callback called with the error, if any, and ListInstancePartitionsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.listInstancePartitions = function listInstancePartitions(request, callback) {
                                return this.rpcCall(listInstancePartitions, $root.google.spanner.admin.instance.v1.ListInstancePartitionsRequest, $root.google.spanner.admin.instance.v1.ListInstancePartitionsResponse, request, callback);
                            }, "name", { value: "ListInstancePartitions" });
    
                            /**
                             * Calls ListInstancePartitions.
                             * @function listInstancePartitions
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest} request ListInstancePartitionsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.ListInstancePartitionsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|getInstance}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef GetInstanceCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.Instance} [response] Instance
                             */
    
                            /**
                             * Calls GetInstance.
                             * @function getInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest} request GetInstanceRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.GetInstanceCallback} callback Node-style callback called with the error, if any, and Instance
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.getInstance = function getInstance(request, callback) {
                                return this.rpcCall(getInstance, $root.google.spanner.admin.instance.v1.GetInstanceRequest, $root.google.spanner.admin.instance.v1.Instance, request, callback);
                            }, "name", { value: "GetInstance" });
    
                            /**
                             * Calls GetInstance.
                             * @function getInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest} request GetInstanceRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.Instance>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|createInstance}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef CreateInstanceCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CreateInstance.
                             * @function createInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest} request CreateInstanceRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.CreateInstanceCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.createInstance = function createInstance(request, callback) {
                                return this.rpcCall(createInstance, $root.google.spanner.admin.instance.v1.CreateInstanceRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CreateInstance" });
    
                            /**
                             * Calls CreateInstance.
                             * @function createInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest} request CreateInstanceRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|updateInstance}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef UpdateInstanceCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls UpdateInstance.
                             * @function updateInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest} request UpdateInstanceRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstanceCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.updateInstance = function updateInstance(request, callback) {
                                return this.rpcCall(updateInstance, $root.google.spanner.admin.instance.v1.UpdateInstanceRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "UpdateInstance" });
    
                            /**
                             * Calls UpdateInstance.
                             * @function updateInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest} request UpdateInstanceRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|deleteInstance}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef DeleteInstanceCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DeleteInstance.
                             * @function deleteInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest} request DeleteInstanceRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstanceCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.deleteInstance = function deleteInstance(request, callback) {
                                return this.rpcCall(deleteInstance, $root.google.spanner.admin.instance.v1.DeleteInstanceRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DeleteInstance" });
    
                            /**
                             * Calls DeleteInstance.
                             * @function deleteInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest} request DeleteInstanceRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|setIamPolicy}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef SetIamPolicyCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.Policy} [response] Policy
                             */
    
                            /**
                             * Calls SetIamPolicy.
                             * @function setIamPolicy
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.SetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.setIamPolicy = function setIamPolicy(request, callback) {
                                return this.rpcCall(setIamPolicy, $root.google.iam.v1.SetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                            }, "name", { value: "SetIamPolicy" });
    
                            /**
                             * Calls SetIamPolicy.
                             * @function setIamPolicy
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                             * @returns {Promise<google.iam.v1.Policy>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|getIamPolicy}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef GetIamPolicyCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.Policy} [response] Policy
                             */
    
                            /**
                             * Calls GetIamPolicy.
                             * @function getIamPolicy
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.GetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.getIamPolicy = function getIamPolicy(request, callback) {
                                return this.rpcCall(getIamPolicy, $root.google.iam.v1.GetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                            }, "name", { value: "GetIamPolicy" });
    
                            /**
                             * Calls GetIamPolicy.
                             * @function getIamPolicy
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                             * @returns {Promise<google.iam.v1.Policy>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|testIamPermissions}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef TestIamPermissionsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.iam.v1.TestIamPermissionsResponse} [response] TestIamPermissionsResponse
                             */
    
                            /**
                             * Calls TestIamPermissions.
                             * @function testIamPermissions
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.TestIamPermissionsCallback} callback Node-style callback called with the error, if any, and TestIamPermissionsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.testIamPermissions = function testIamPermissions(request, callback) {
                                return this.rpcCall(testIamPermissions, $root.google.iam.v1.TestIamPermissionsRequest, $root.google.iam.v1.TestIamPermissionsResponse, request, callback);
                            }, "name", { value: "TestIamPermissions" });
    
                            /**
                             * Calls TestIamPermissions.
                             * @function testIamPermissions
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                             * @returns {Promise<google.iam.v1.TestIamPermissionsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|getInstancePartition}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef GetInstancePartitionCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.InstancePartition} [response] InstancePartition
                             */
    
                            /**
                             * Calls GetInstancePartition.
                             * @function getInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest} request GetInstancePartitionRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.GetInstancePartitionCallback} callback Node-style callback called with the error, if any, and InstancePartition
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.getInstancePartition = function getInstancePartition(request, callback) {
                                return this.rpcCall(getInstancePartition, $root.google.spanner.admin.instance.v1.GetInstancePartitionRequest, $root.google.spanner.admin.instance.v1.InstancePartition, request, callback);
                            }, "name", { value: "GetInstancePartition" });
    
                            /**
                             * Calls GetInstancePartition.
                             * @function getInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest} request GetInstancePartitionRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.InstancePartition>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|createInstancePartition}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef CreateInstancePartitionCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls CreateInstancePartition.
                             * @function createInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest} request CreateInstancePartitionRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.CreateInstancePartitionCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.createInstancePartition = function createInstancePartition(request, callback) {
                                return this.rpcCall(createInstancePartition, $root.google.spanner.admin.instance.v1.CreateInstancePartitionRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "CreateInstancePartition" });
    
                            /**
                             * Calls CreateInstancePartition.
                             * @function createInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest} request CreateInstancePartitionRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|deleteInstancePartition}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef DeleteInstancePartitionCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.protobuf.Empty} [response] Empty
                             */
    
                            /**
                             * Calls DeleteInstancePartition.
                             * @function deleteInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest} request DeleteInstancePartitionRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstancePartitionCallback} callback Node-style callback called with the error, if any, and Empty
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.deleteInstancePartition = function deleteInstancePartition(request, callback) {
                                return this.rpcCall(deleteInstancePartition, $root.google.spanner.admin.instance.v1.DeleteInstancePartitionRequest, $root.google.protobuf.Empty, request, callback);
                            }, "name", { value: "DeleteInstancePartition" });
    
                            /**
                             * Calls DeleteInstancePartition.
                             * @function deleteInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest} request DeleteInstancePartitionRequest message or plain object
                             * @returns {Promise<google.protobuf.Empty>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|updateInstancePartition}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef UpdateInstancePartitionCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls UpdateInstancePartition.
                             * @function updateInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest} request UpdateInstancePartitionRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstancePartitionCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.updateInstancePartition = function updateInstancePartition(request, callback) {
                                return this.rpcCall(updateInstancePartition, $root.google.spanner.admin.instance.v1.UpdateInstancePartitionRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "UpdateInstancePartition" });
    
                            /**
                             * Calls UpdateInstancePartition.
                             * @function updateInstancePartition
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest} request UpdateInstancePartitionRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|listInstancePartitionOperations}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef ListInstancePartitionOperationsCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} [response] ListInstancePartitionOperationsResponse
                             */
    
                            /**
                             * Calls ListInstancePartitionOperations.
                             * @function listInstancePartitionOperations
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest} request ListInstancePartitionOperationsRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.ListInstancePartitionOperationsCallback} callback Node-style callback called with the error, if any, and ListInstancePartitionOperationsResponse
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.listInstancePartitionOperations = function listInstancePartitionOperations(request, callback) {
                                return this.rpcCall(listInstancePartitionOperations, $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest, $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse, request, callback);
                            }, "name", { value: "ListInstancePartitionOperations" });
    
                            /**
                             * Calls ListInstancePartitionOperations.
                             * @function listInstancePartitionOperations
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest} request ListInstancePartitionOperationsRequest message or plain object
                             * @returns {Promise<google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse>} Promise
                             * @variation 2
                             */
    
                            /**
                             * Callback as used by {@link google.spanner.admin.instance.v1.InstanceAdmin|moveInstance}.
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @typedef MoveInstanceCallback
                             * @type {function}
                             * @param {Error|null} error Error, if any
                             * @param {google.longrunning.Operation} [response] Operation
                             */
    
                            /**
                             * Calls MoveInstance.
                             * @function moveInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest} request MoveInstanceRequest message or plain object
                             * @param {google.spanner.admin.instance.v1.InstanceAdmin.MoveInstanceCallback} callback Node-style callback called with the error, if any, and Operation
                             * @returns {undefined}
                             * @variation 1
                             */
                            Object.defineProperty(InstanceAdmin.prototype.moveInstance = function moveInstance(request, callback) {
                                return this.rpcCall(moveInstance, $root.google.spanner.admin.instance.v1.MoveInstanceRequest, $root.google.longrunning.Operation, request, callback);
                            }, "name", { value: "MoveInstance" });
    
                            /**
                             * Calls MoveInstance.
                             * @function moveInstance
                             * @memberof google.spanner.admin.instance.v1.InstanceAdmin
                             * @instance
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest} request MoveInstanceRequest message or plain object
                             * @returns {Promise<google.longrunning.Operation>} Promise
                             * @variation 2
                             */
    
                            return InstanceAdmin;
                        })();
    
                        v1.ReplicaInfo = (function() {
    
                            /**
                             * Properties of a ReplicaInfo.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IReplicaInfo
                             * @property {string|null} [location] ReplicaInfo location
                             * @property {google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType|null} [type] ReplicaInfo type
                             * @property {boolean|null} [defaultLeaderLocation] ReplicaInfo defaultLeaderLocation
                             */
    
                            /**
                             * Constructs a new ReplicaInfo.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ReplicaInfo.
                             * @implements IReplicaInfo
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IReplicaInfo=} [properties] Properties to set
                             */
                            function ReplicaInfo(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ReplicaInfo location.
                             * @member {string} location
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @instance
                             */
                            ReplicaInfo.prototype.location = "";
    
                            /**
                             * ReplicaInfo type.
                             * @member {google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType} type
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @instance
                             */
                            ReplicaInfo.prototype.type = 0;
    
                            /**
                             * ReplicaInfo defaultLeaderLocation.
                             * @member {boolean} defaultLeaderLocation
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @instance
                             */
                            ReplicaInfo.prototype.defaultLeaderLocation = false;
    
                            /**
                             * Creates a new ReplicaInfo instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaInfo=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ReplicaInfo} ReplicaInfo instance
                             */
                            ReplicaInfo.create = function create(properties) {
                                return new ReplicaInfo(properties);
                            };
    
                            /**
                             * Encodes the specified ReplicaInfo message. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaInfo.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaInfo} message ReplicaInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaInfo.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.location);
                                if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type);
                                if (message.defaultLeaderLocation != null && Object.hasOwnProperty.call(message, "defaultLeaderLocation"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).bool(message.defaultLeaderLocation);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ReplicaInfo message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaInfo.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaInfo} message ReplicaInfo message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaInfo.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ReplicaInfo message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ReplicaInfo} ReplicaInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaInfo.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ReplicaInfo();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.location = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.type = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.defaultLeaderLocation = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ReplicaInfo message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ReplicaInfo} ReplicaInfo
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaInfo.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ReplicaInfo message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ReplicaInfo.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.location != null && message.hasOwnProperty("location"))
                                    if (!$util.isString(message.location))
                                        return "location: string expected";
                                if (message.type != null && message.hasOwnProperty("type"))
                                    switch (message.type) {
                                    default:
                                        return "type: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.defaultLeaderLocation != null && message.hasOwnProperty("defaultLeaderLocation"))
                                    if (typeof message.defaultLeaderLocation !== "boolean")
                                        return "defaultLeaderLocation: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates a ReplicaInfo message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ReplicaInfo} ReplicaInfo
                             */
                            ReplicaInfo.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ReplicaInfo)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ReplicaInfo();
                                if (object.location != null)
                                    message.location = String(object.location);
                                switch (object.type) {
                                default:
                                    if (typeof object.type === "number") {
                                        message.type = object.type;
                                        break;
                                    }
                                    break;
                                case "TYPE_UNSPECIFIED":
                                case 0:
                                    message.type = 0;
                                    break;
                                case "READ_WRITE":
                                case 1:
                                    message.type = 1;
                                    break;
                                case "READ_ONLY":
                                case 2:
                                    message.type = 2;
                                    break;
                                case "WITNESS":
                                case 3:
                                    message.type = 3;
                                    break;
                                }
                                if (object.defaultLeaderLocation != null)
                                    message.defaultLeaderLocation = Boolean(object.defaultLeaderLocation);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ReplicaInfo message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {google.spanner.admin.instance.v1.ReplicaInfo} message ReplicaInfo
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ReplicaInfo.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.location = "";
                                    object.type = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                                    object.defaultLeaderLocation = false;
                                }
                                if (message.location != null && message.hasOwnProperty("location"))
                                    object.location = message.location;
                                if (message.type != null && message.hasOwnProperty("type"))
                                    object.type = options.enums === String ? $root.google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType[message.type] === undefined ? message.type : $root.google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType[message.type] : message.type;
                                if (message.defaultLeaderLocation != null && message.hasOwnProperty("defaultLeaderLocation"))
                                    object.defaultLeaderLocation = message.defaultLeaderLocation;
                                return object;
                            };
    
                            /**
                             * Converts this ReplicaInfo to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ReplicaInfo.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ReplicaInfo
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ReplicaInfo
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ReplicaInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ReplicaInfo";
                            };
    
                            /**
                             * ReplicaType enum.
                             * @name google.spanner.admin.instance.v1.ReplicaInfo.ReplicaType
                             * @enum {number}
                             * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                             * @property {number} READ_WRITE=1 READ_WRITE value
                             * @property {number} READ_ONLY=2 READ_ONLY value
                             * @property {number} WITNESS=3 WITNESS value
                             */
                            ReplicaInfo.ReplicaType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "READ_WRITE"] = 1;
                                values[valuesById[2] = "READ_ONLY"] = 2;
                                values[valuesById[3] = "WITNESS"] = 3;
                                return values;
                            })();
    
                            return ReplicaInfo;
                        })();
    
                        v1.InstanceConfig = (function() {
    
                            /**
                             * Properties of an InstanceConfig.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IInstanceConfig
                             * @property {string|null} [name] InstanceConfig name
                             * @property {string|null} [displayName] InstanceConfig displayName
                             * @property {google.spanner.admin.instance.v1.InstanceConfig.Type|null} [configType] InstanceConfig configType
                             * @property {Array.<google.spanner.admin.instance.v1.IReplicaInfo>|null} [replicas] InstanceConfig replicas
                             * @property {Array.<google.spanner.admin.instance.v1.IReplicaInfo>|null} [optionalReplicas] InstanceConfig optionalReplicas
                             * @property {string|null} [baseConfig] InstanceConfig baseConfig
                             * @property {Object.<string,string>|null} [labels] InstanceConfig labels
                             * @property {string|null} [etag] InstanceConfig etag
                             * @property {Array.<string>|null} [leaderOptions] InstanceConfig leaderOptions
                             * @property {boolean|null} [reconciling] InstanceConfig reconciling
                             * @property {google.spanner.admin.instance.v1.InstanceConfig.State|null} [state] InstanceConfig state
                             * @property {google.spanner.admin.instance.v1.InstanceConfig.FreeInstanceAvailability|null} [freeInstanceAvailability] InstanceConfig freeInstanceAvailability
                             * @property {google.spanner.admin.instance.v1.InstanceConfig.QuorumType|null} [quorumType] InstanceConfig quorumType
                             * @property {number|Long|null} [storageLimitPerProcessingUnit] InstanceConfig storageLimitPerProcessingUnit
                             */
    
                            /**
                             * Constructs a new InstanceConfig.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an InstanceConfig.
                             * @implements IInstanceConfig
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IInstanceConfig=} [properties] Properties to set
                             */
                            function InstanceConfig(properties) {
                                this.replicas = [];
                                this.optionalReplicas = [];
                                this.labels = {};
                                this.leaderOptions = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * InstanceConfig name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.name = "";
    
                            /**
                             * InstanceConfig displayName.
                             * @member {string} displayName
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.displayName = "";
    
                            /**
                             * InstanceConfig configType.
                             * @member {google.spanner.admin.instance.v1.InstanceConfig.Type} configType
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.configType = 0;
    
                            /**
                             * InstanceConfig replicas.
                             * @member {Array.<google.spanner.admin.instance.v1.IReplicaInfo>} replicas
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.replicas = $util.emptyArray;
    
                            /**
                             * InstanceConfig optionalReplicas.
                             * @member {Array.<google.spanner.admin.instance.v1.IReplicaInfo>} optionalReplicas
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.optionalReplicas = $util.emptyArray;
    
                            /**
                             * InstanceConfig baseConfig.
                             * @member {string} baseConfig
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.baseConfig = "";
    
                            /**
                             * InstanceConfig labels.
                             * @member {Object.<string,string>} labels
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.labels = $util.emptyObject;
    
                            /**
                             * InstanceConfig etag.
                             * @member {string} etag
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.etag = "";
    
                            /**
                             * InstanceConfig leaderOptions.
                             * @member {Array.<string>} leaderOptions
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.leaderOptions = $util.emptyArray;
    
                            /**
                             * InstanceConfig reconciling.
                             * @member {boolean} reconciling
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.reconciling = false;
    
                            /**
                             * InstanceConfig state.
                             * @member {google.spanner.admin.instance.v1.InstanceConfig.State} state
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.state = 0;
    
                            /**
                             * InstanceConfig freeInstanceAvailability.
                             * @member {google.spanner.admin.instance.v1.InstanceConfig.FreeInstanceAvailability} freeInstanceAvailability
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.freeInstanceAvailability = 0;
    
                            /**
                             * InstanceConfig quorumType.
                             * @member {google.spanner.admin.instance.v1.InstanceConfig.QuorumType} quorumType
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.quorumType = 0;
    
                            /**
                             * InstanceConfig storageLimitPerProcessingUnit.
                             * @member {number|Long} storageLimitPerProcessingUnit
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             */
                            InstanceConfig.prototype.storageLimitPerProcessingUnit = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Creates a new InstanceConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstanceConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.InstanceConfig} InstanceConfig instance
                             */
                            InstanceConfig.create = function create(properties) {
                                return new InstanceConfig(properties);
                            };
    
                            /**
                             * Encodes the specified InstanceConfig message. Does not implicitly {@link google.spanner.admin.instance.v1.InstanceConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstanceConfig} message InstanceConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InstanceConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.displayName);
                                if (message.replicas != null && message.replicas.length)
                                    for (var i = 0; i < message.replicas.length; ++i)
                                        $root.google.spanner.admin.instance.v1.ReplicaInfo.encode(message.replicas[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.leaderOptions != null && message.leaderOptions.length)
                                    for (var i = 0; i < message.leaderOptions.length; ++i)
                                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.leaderOptions[i]);
                                if (message.configType != null && Object.hasOwnProperty.call(message, "configType"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.configType);
                                if (message.optionalReplicas != null && message.optionalReplicas.length)
                                    for (var i = 0; i < message.optionalReplicas.length; ++i)
                                        $root.google.spanner.admin.instance.v1.ReplicaInfo.encode(message.optionalReplicas[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                                if (message.baseConfig != null && Object.hasOwnProperty.call(message, "baseConfig"))
                                    writer.uint32(/* id 7, wireType 2 =*/58).string(message.baseConfig);
                                if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                                    for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                        writer.uint32(/* id 8, wireType 2 =*/66).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                                if (message.etag != null && Object.hasOwnProperty.call(message, "etag"))
                                    writer.uint32(/* id 9, wireType 2 =*/74).string(message.etag);
                                if (message.reconciling != null && Object.hasOwnProperty.call(message, "reconciling"))
                                    writer.uint32(/* id 10, wireType 0 =*/80).bool(message.reconciling);
                                if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                                    writer.uint32(/* id 11, wireType 0 =*/88).int32(message.state);
                                if (message.freeInstanceAvailability != null && Object.hasOwnProperty.call(message, "freeInstanceAvailability"))
                                    writer.uint32(/* id 12, wireType 0 =*/96).int32(message.freeInstanceAvailability);
                                if (message.quorumType != null && Object.hasOwnProperty.call(message, "quorumType"))
                                    writer.uint32(/* id 18, wireType 0 =*/144).int32(message.quorumType);
                                if (message.storageLimitPerProcessingUnit != null && Object.hasOwnProperty.call(message, "storageLimitPerProcessingUnit"))
                                    writer.uint32(/* id 19, wireType 0 =*/152).int64(message.storageLimitPerProcessingUnit);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified InstanceConfig message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.InstanceConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstanceConfig} message InstanceConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InstanceConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an InstanceConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.InstanceConfig} InstanceConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InstanceConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.InstanceConfig(), key, value;
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.displayName = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.configType = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.replicas && message.replicas.length))
                                                message.replicas = [];
                                            message.replicas.push($root.google.spanner.admin.instance.v1.ReplicaInfo.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 6: {
                                            if (!(message.optionalReplicas && message.optionalReplicas.length))
                                                message.optionalReplicas = [];
                                            message.optionalReplicas.push($root.google.spanner.admin.instance.v1.ReplicaInfo.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 7: {
                                            message.baseConfig = reader.string();
                                            break;
                                        }
                                    case 8: {
                                            if (message.labels === $util.emptyObject)
                                                message.labels = {};
                                            var end2 = reader.uint32() + reader.pos;
                                            key = "";
                                            value = "";
                                            while (reader.pos < end2) {
                                                var tag2 = reader.uint32();
                                                switch (tag2 >>> 3) {
                                                case 1:
                                                    key = reader.string();
                                                    break;
                                                case 2:
                                                    value = reader.string();
                                                    break;
                                                default:
                                                    reader.skipType(tag2 & 7);
                                                    break;
                                                }
                                            }
                                            message.labels[key] = value;
                                            break;
                                        }
                                    case 9: {
                                            message.etag = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            if (!(message.leaderOptions && message.leaderOptions.length))
                                                message.leaderOptions = [];
                                            message.leaderOptions.push(reader.string());
                                            break;
                                        }
                                    case 10: {
                                            message.reconciling = reader.bool();
                                            break;
                                        }
                                    case 11: {
                                            message.state = reader.int32();
                                            break;
                                        }
                                    case 12: {
                                            message.freeInstanceAvailability = reader.int32();
                                            break;
                                        }
                                    case 18: {
                                            message.quorumType = reader.int32();
                                            break;
                                        }
                                    case 19: {
                                            message.storageLimitPerProcessingUnit = reader.int64();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an InstanceConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.InstanceConfig} InstanceConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InstanceConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an InstanceConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            InstanceConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    if (!$util.isString(message.displayName))
                                        return "displayName: string expected";
                                if (message.configType != null && message.hasOwnProperty("configType"))
                                    switch (message.configType) {
                                    default:
                                        return "configType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.replicas != null && message.hasOwnProperty("replicas")) {
                                    if (!Array.isArray(message.replicas))
                                        return "replicas: array expected";
                                    for (var i = 0; i < message.replicas.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.ReplicaInfo.verify(message.replicas[i]);
                                        if (error)
                                            return "replicas." + error;
                                    }
                                }
                                if (message.optionalReplicas != null && message.hasOwnProperty("optionalReplicas")) {
                                    if (!Array.isArray(message.optionalReplicas))
                                        return "optionalReplicas: array expected";
                                    for (var i = 0; i < message.optionalReplicas.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.ReplicaInfo.verify(message.optionalReplicas[i]);
                                        if (error)
                                            return "optionalReplicas." + error;
                                    }
                                }
                                if (message.baseConfig != null && message.hasOwnProperty("baseConfig"))
                                    if (!$util.isString(message.baseConfig))
                                        return "baseConfig: string expected";
                                if (message.labels != null && message.hasOwnProperty("labels")) {
                                    if (!$util.isObject(message.labels))
                                        return "labels: object expected";
                                    var key = Object.keys(message.labels);
                                    for (var i = 0; i < key.length; ++i)
                                        if (!$util.isString(message.labels[key[i]]))
                                            return "labels: string{k:string} expected";
                                }
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    if (!$util.isString(message.etag))
                                        return "etag: string expected";
                                if (message.leaderOptions != null && message.hasOwnProperty("leaderOptions")) {
                                    if (!Array.isArray(message.leaderOptions))
                                        return "leaderOptions: array expected";
                                    for (var i = 0; i < message.leaderOptions.length; ++i)
                                        if (!$util.isString(message.leaderOptions[i]))
                                            return "leaderOptions: string[] expected";
                                }
                                if (message.reconciling != null && message.hasOwnProperty("reconciling"))
                                    if (typeof message.reconciling !== "boolean")
                                        return "reconciling: boolean expected";
                                if (message.state != null && message.hasOwnProperty("state"))
                                    switch (message.state) {
                                    default:
                                        return "state: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.freeInstanceAvailability != null && message.hasOwnProperty("freeInstanceAvailability"))
                                    switch (message.freeInstanceAvailability) {
                                    default:
                                        return "freeInstanceAvailability: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                    case 4:
                                        break;
                                    }
                                if (message.quorumType != null && message.hasOwnProperty("quorumType"))
                                    switch (message.quorumType) {
                                    default:
                                        return "quorumType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.storageLimitPerProcessingUnit != null && message.hasOwnProperty("storageLimitPerProcessingUnit"))
                                    if (!$util.isInteger(message.storageLimitPerProcessingUnit) && !(message.storageLimitPerProcessingUnit && $util.isInteger(message.storageLimitPerProcessingUnit.low) && $util.isInteger(message.storageLimitPerProcessingUnit.high)))
                                        return "storageLimitPerProcessingUnit: integer|Long expected";
                                return null;
                            };
    
                            /**
                             * Creates an InstanceConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.InstanceConfig} InstanceConfig
                             */
                            InstanceConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.InstanceConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.InstanceConfig();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.displayName != null)
                                    message.displayName = String(object.displayName);
                                switch (object.configType) {
                                default:
                                    if (typeof object.configType === "number") {
                                        message.configType = object.configType;
                                        break;
                                    }
                                    break;
                                case "TYPE_UNSPECIFIED":
                                case 0:
                                    message.configType = 0;
                                    break;
                                case "GOOGLE_MANAGED":
                                case 1:
                                    message.configType = 1;
                                    break;
                                case "USER_MANAGED":
                                case 2:
                                    message.configType = 2;
                                    break;
                                }
                                if (object.replicas) {
                                    if (!Array.isArray(object.replicas))
                                        throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.replicas: array expected");
                                    message.replicas = [];
                                    for (var i = 0; i < object.replicas.length; ++i) {
                                        if (typeof object.replicas[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.replicas: object expected");
                                        message.replicas[i] = $root.google.spanner.admin.instance.v1.ReplicaInfo.fromObject(object.replicas[i]);
                                    }
                                }
                                if (object.optionalReplicas) {
                                    if (!Array.isArray(object.optionalReplicas))
                                        throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.optionalReplicas: array expected");
                                    message.optionalReplicas = [];
                                    for (var i = 0; i < object.optionalReplicas.length; ++i) {
                                        if (typeof object.optionalReplicas[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.optionalReplicas: object expected");
                                        message.optionalReplicas[i] = $root.google.spanner.admin.instance.v1.ReplicaInfo.fromObject(object.optionalReplicas[i]);
                                    }
                                }
                                if (object.baseConfig != null)
                                    message.baseConfig = String(object.baseConfig);
                                if (object.labels) {
                                    if (typeof object.labels !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.labels: object expected");
                                    message.labels = {};
                                    for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                        message.labels[keys[i]] = String(object.labels[keys[i]]);
                                }
                                if (object.etag != null)
                                    message.etag = String(object.etag);
                                if (object.leaderOptions) {
                                    if (!Array.isArray(object.leaderOptions))
                                        throw TypeError(".google.spanner.admin.instance.v1.InstanceConfig.leaderOptions: array expected");
                                    message.leaderOptions = [];
                                    for (var i = 0; i < object.leaderOptions.length; ++i)
                                        message.leaderOptions[i] = String(object.leaderOptions[i]);
                                }
                                if (object.reconciling != null)
                                    message.reconciling = Boolean(object.reconciling);
                                switch (object.state) {
                                default:
                                    if (typeof object.state === "number") {
                                        message.state = object.state;
                                        break;
                                    }
                                    break;
                                case "STATE_UNSPECIFIED":
                                case 0:
                                    message.state = 0;
                                    break;
                                case "CREATING":
                                case 1:
                                    message.state = 1;
                                    break;
                                case "READY":
                                case 2:
                                    message.state = 2;
                                    break;
                                }
                                switch (object.freeInstanceAvailability) {
                                default:
                                    if (typeof object.freeInstanceAvailability === "number") {
                                        message.freeInstanceAvailability = object.freeInstanceAvailability;
                                        break;
                                    }
                                    break;
                                case "FREE_INSTANCE_AVAILABILITY_UNSPECIFIED":
                                case 0:
                                    message.freeInstanceAvailability = 0;
                                    break;
                                case "AVAILABLE":
                                case 1:
                                    message.freeInstanceAvailability = 1;
                                    break;
                                case "UNSUPPORTED":
                                case 2:
                                    message.freeInstanceAvailability = 2;
                                    break;
                                case "DISABLED":
                                case 3:
                                    message.freeInstanceAvailability = 3;
                                    break;
                                case "QUOTA_EXCEEDED":
                                case 4:
                                    message.freeInstanceAvailability = 4;
                                    break;
                                }
                                switch (object.quorumType) {
                                default:
                                    if (typeof object.quorumType === "number") {
                                        message.quorumType = object.quorumType;
                                        break;
                                    }
                                    break;
                                case "QUORUM_TYPE_UNSPECIFIED":
                                case 0:
                                    message.quorumType = 0;
                                    break;
                                case "REGION":
                                case 1:
                                    message.quorumType = 1;
                                    break;
                                case "DUAL_REGION":
                                case 2:
                                    message.quorumType = 2;
                                    break;
                                case "MULTI_REGION":
                                case 3:
                                    message.quorumType = 3;
                                    break;
                                }
                                if (object.storageLimitPerProcessingUnit != null)
                                    if ($util.Long)
                                        (message.storageLimitPerProcessingUnit = $util.Long.fromValue(object.storageLimitPerProcessingUnit)).unsigned = false;
                                    else if (typeof object.storageLimitPerProcessingUnit === "string")
                                        message.storageLimitPerProcessingUnit = parseInt(object.storageLimitPerProcessingUnit, 10);
                                    else if (typeof object.storageLimitPerProcessingUnit === "number")
                                        message.storageLimitPerProcessingUnit = object.storageLimitPerProcessingUnit;
                                    else if (typeof object.storageLimitPerProcessingUnit === "object")
                                        message.storageLimitPerProcessingUnit = new $util.LongBits(object.storageLimitPerProcessingUnit.low >>> 0, object.storageLimitPerProcessingUnit.high >>> 0).toNumber();
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an InstanceConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.InstanceConfig} message InstanceConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            InstanceConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.replicas = [];
                                    object.leaderOptions = [];
                                    object.optionalReplicas = [];
                                }
                                if (options.objects || options.defaults)
                                    object.labels = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.displayName = "";
                                    object.configType = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                                    object.baseConfig = "";
                                    object.etag = "";
                                    object.reconciling = false;
                                    object.state = options.enums === String ? "STATE_UNSPECIFIED" : 0;
                                    object.freeInstanceAvailability = options.enums === String ? "FREE_INSTANCE_AVAILABILITY_UNSPECIFIED" : 0;
                                    object.quorumType = options.enums === String ? "QUORUM_TYPE_UNSPECIFIED" : 0;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.storageLimitPerProcessingUnit = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.storageLimitPerProcessingUnit = options.longs === String ? "0" : 0;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    object.displayName = message.displayName;
                                if (message.replicas && message.replicas.length) {
                                    object.replicas = [];
                                    for (var j = 0; j < message.replicas.length; ++j)
                                        object.replicas[j] = $root.google.spanner.admin.instance.v1.ReplicaInfo.toObject(message.replicas[j], options);
                                }
                                if (message.leaderOptions && message.leaderOptions.length) {
                                    object.leaderOptions = [];
                                    for (var j = 0; j < message.leaderOptions.length; ++j)
                                        object.leaderOptions[j] = message.leaderOptions[j];
                                }
                                if (message.configType != null && message.hasOwnProperty("configType"))
                                    object.configType = options.enums === String ? $root.google.spanner.admin.instance.v1.InstanceConfig.Type[message.configType] === undefined ? message.configType : $root.google.spanner.admin.instance.v1.InstanceConfig.Type[message.configType] : message.configType;
                                if (message.optionalReplicas && message.optionalReplicas.length) {
                                    object.optionalReplicas = [];
                                    for (var j = 0; j < message.optionalReplicas.length; ++j)
                                        object.optionalReplicas[j] = $root.google.spanner.admin.instance.v1.ReplicaInfo.toObject(message.optionalReplicas[j], options);
                                }
                                if (message.baseConfig != null && message.hasOwnProperty("baseConfig"))
                                    object.baseConfig = message.baseConfig;
                                var keys2;
                                if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                                    object.labels = {};
                                    for (var j = 0; j < keys2.length; ++j)
                                        object.labels[keys2[j]] = message.labels[keys2[j]];
                                }
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    object.etag = message.etag;
                                if (message.reconciling != null && message.hasOwnProperty("reconciling"))
                                    object.reconciling = message.reconciling;
                                if (message.state != null && message.hasOwnProperty("state"))
                                    object.state = options.enums === String ? $root.google.spanner.admin.instance.v1.InstanceConfig.State[message.state] === undefined ? message.state : $root.google.spanner.admin.instance.v1.InstanceConfig.State[message.state] : message.state;
                                if (message.freeInstanceAvailability != null && message.hasOwnProperty("freeInstanceAvailability"))
                                    object.freeInstanceAvailability = options.enums === String ? $root.google.spanner.admin.instance.v1.InstanceConfig.FreeInstanceAvailability[message.freeInstanceAvailability] === undefined ? message.freeInstanceAvailability : $root.google.spanner.admin.instance.v1.InstanceConfig.FreeInstanceAvailability[message.freeInstanceAvailability] : message.freeInstanceAvailability;
                                if (message.quorumType != null && message.hasOwnProperty("quorumType"))
                                    object.quorumType = options.enums === String ? $root.google.spanner.admin.instance.v1.InstanceConfig.QuorumType[message.quorumType] === undefined ? message.quorumType : $root.google.spanner.admin.instance.v1.InstanceConfig.QuorumType[message.quorumType] : message.quorumType;
                                if (message.storageLimitPerProcessingUnit != null && message.hasOwnProperty("storageLimitPerProcessingUnit"))
                                    if (typeof message.storageLimitPerProcessingUnit === "number")
                                        object.storageLimitPerProcessingUnit = options.longs === String ? String(message.storageLimitPerProcessingUnit) : message.storageLimitPerProcessingUnit;
                                    else
                                        object.storageLimitPerProcessingUnit = options.longs === String ? $util.Long.prototype.toString.call(message.storageLimitPerProcessingUnit) : options.longs === Number ? new $util.LongBits(message.storageLimitPerProcessingUnit.low >>> 0, message.storageLimitPerProcessingUnit.high >>> 0).toNumber() : message.storageLimitPerProcessingUnit;
                                return object;
                            };
    
                            /**
                             * Converts this InstanceConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            InstanceConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for InstanceConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.InstanceConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            InstanceConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.InstanceConfig";
                            };
    
                            /**
                             * Type enum.
                             * @name google.spanner.admin.instance.v1.InstanceConfig.Type
                             * @enum {number}
                             * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                             * @property {number} GOOGLE_MANAGED=1 GOOGLE_MANAGED value
                             * @property {number} USER_MANAGED=2 USER_MANAGED value
                             */
                            InstanceConfig.Type = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "GOOGLE_MANAGED"] = 1;
                                values[valuesById[2] = "USER_MANAGED"] = 2;
                                return values;
                            })();
    
                            /**
                             * State enum.
                             * @name google.spanner.admin.instance.v1.InstanceConfig.State
                             * @enum {number}
                             * @property {number} STATE_UNSPECIFIED=0 STATE_UNSPECIFIED value
                             * @property {number} CREATING=1 CREATING value
                             * @property {number} READY=2 READY value
                             */
                            InstanceConfig.State = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "STATE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "CREATING"] = 1;
                                values[valuesById[2] = "READY"] = 2;
                                return values;
                            })();
    
                            /**
                             * FreeInstanceAvailability enum.
                             * @name google.spanner.admin.instance.v1.InstanceConfig.FreeInstanceAvailability
                             * @enum {number}
                             * @property {number} FREE_INSTANCE_AVAILABILITY_UNSPECIFIED=0 FREE_INSTANCE_AVAILABILITY_UNSPECIFIED value
                             * @property {number} AVAILABLE=1 AVAILABLE value
                             * @property {number} UNSUPPORTED=2 UNSUPPORTED value
                             * @property {number} DISABLED=3 DISABLED value
                             * @property {number} QUOTA_EXCEEDED=4 QUOTA_EXCEEDED value
                             */
                            InstanceConfig.FreeInstanceAvailability = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "FREE_INSTANCE_AVAILABILITY_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "AVAILABLE"] = 1;
                                values[valuesById[2] = "UNSUPPORTED"] = 2;
                                values[valuesById[3] = "DISABLED"] = 3;
                                values[valuesById[4] = "QUOTA_EXCEEDED"] = 4;
                                return values;
                            })();
    
                            /**
                             * QuorumType enum.
                             * @name google.spanner.admin.instance.v1.InstanceConfig.QuorumType
                             * @enum {number}
                             * @property {number} QUORUM_TYPE_UNSPECIFIED=0 QUORUM_TYPE_UNSPECIFIED value
                             * @property {number} REGION=1 REGION value
                             * @property {number} DUAL_REGION=2 DUAL_REGION value
                             * @property {number} MULTI_REGION=3 MULTI_REGION value
                             */
                            InstanceConfig.QuorumType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "QUORUM_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "REGION"] = 1;
                                values[valuesById[2] = "DUAL_REGION"] = 2;
                                values[valuesById[3] = "MULTI_REGION"] = 3;
                                return values;
                            })();
    
                            return InstanceConfig;
                        })();
    
                        v1.ReplicaComputeCapacity = (function() {
    
                            /**
                             * Properties of a ReplicaComputeCapacity.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IReplicaComputeCapacity
                             * @property {google.spanner.admin.instance.v1.IReplicaSelection|null} [replicaSelection] ReplicaComputeCapacity replicaSelection
                             * @property {number|null} [nodeCount] ReplicaComputeCapacity nodeCount
                             * @property {number|null} [processingUnits] ReplicaComputeCapacity processingUnits
                             */
    
                            /**
                             * Constructs a new ReplicaComputeCapacity.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ReplicaComputeCapacity.
                             * @implements IReplicaComputeCapacity
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IReplicaComputeCapacity=} [properties] Properties to set
                             */
                            function ReplicaComputeCapacity(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ReplicaComputeCapacity replicaSelection.
                             * @member {google.spanner.admin.instance.v1.IReplicaSelection|null|undefined} replicaSelection
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @instance
                             */
                            ReplicaComputeCapacity.prototype.replicaSelection = null;
    
                            /**
                             * ReplicaComputeCapacity nodeCount.
                             * @member {number|null|undefined} nodeCount
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @instance
                             */
                            ReplicaComputeCapacity.prototype.nodeCount = null;
    
                            /**
                             * ReplicaComputeCapacity processingUnits.
                             * @member {number|null|undefined} processingUnits
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @instance
                             */
                            ReplicaComputeCapacity.prototype.processingUnits = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * ReplicaComputeCapacity computeCapacity.
                             * @member {"nodeCount"|"processingUnits"|undefined} computeCapacity
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @instance
                             */
                            Object.defineProperty(ReplicaComputeCapacity.prototype, "computeCapacity", {
                                get: $util.oneOfGetter($oneOfFields = ["nodeCount", "processingUnits"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new ReplicaComputeCapacity instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaComputeCapacity=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ReplicaComputeCapacity} ReplicaComputeCapacity instance
                             */
                            ReplicaComputeCapacity.create = function create(properties) {
                                return new ReplicaComputeCapacity(properties);
                            };
    
                            /**
                             * Encodes the specified ReplicaComputeCapacity message. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaComputeCapacity.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaComputeCapacity} message ReplicaComputeCapacity message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaComputeCapacity.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.replicaSelection != null && Object.hasOwnProperty.call(message, "replicaSelection"))
                                    $root.google.spanner.admin.instance.v1.ReplicaSelection.encode(message.replicaSelection, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nodeCount != null && Object.hasOwnProperty.call(message, "nodeCount"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nodeCount);
                                if (message.processingUnits != null && Object.hasOwnProperty.call(message, "processingUnits"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.processingUnits);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ReplicaComputeCapacity message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ReplicaComputeCapacity.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {google.spanner.admin.instance.v1.IReplicaComputeCapacity} message ReplicaComputeCapacity message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ReplicaComputeCapacity.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ReplicaComputeCapacity message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ReplicaComputeCapacity} ReplicaComputeCapacity
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaComputeCapacity.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.nodeCount = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.processingUnits = reader.int32();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ReplicaComputeCapacity message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ReplicaComputeCapacity} ReplicaComputeCapacity
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ReplicaComputeCapacity.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ReplicaComputeCapacity message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ReplicaComputeCapacity.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.replicaSelection != null && message.hasOwnProperty("replicaSelection")) {
                                    var error = $root.google.spanner.admin.instance.v1.ReplicaSelection.verify(message.replicaSelection);
                                    if (error)
                                        return "replicaSelection." + error;
                                }
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                    properties.computeCapacity = 1;
                                    if (!$util.isInteger(message.nodeCount))
                                        return "nodeCount: integer expected";
                                }
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                    if (properties.computeCapacity === 1)
                                        return "computeCapacity: multiple values";
                                    properties.computeCapacity = 1;
                                    if (!$util.isInteger(message.processingUnits))
                                        return "processingUnits: integer expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ReplicaComputeCapacity message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ReplicaComputeCapacity} ReplicaComputeCapacity
                             */
                            ReplicaComputeCapacity.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity();
                                if (object.replicaSelection != null) {
                                    if (typeof object.replicaSelection !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.ReplicaComputeCapacity.replicaSelection: object expected");
                                    message.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.fromObject(object.replicaSelection);
                                }
                                if (object.nodeCount != null)
                                    message.nodeCount = object.nodeCount | 0;
                                if (object.processingUnits != null)
                                    message.processingUnits = object.processingUnits | 0;
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ReplicaComputeCapacity message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {google.spanner.admin.instance.v1.ReplicaComputeCapacity} message ReplicaComputeCapacity
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ReplicaComputeCapacity.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.replicaSelection = null;
                                if (message.replicaSelection != null && message.hasOwnProperty("replicaSelection"))
                                    object.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.toObject(message.replicaSelection, options);
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                    object.nodeCount = message.nodeCount;
                                    if (options.oneofs)
                                        object.computeCapacity = "nodeCount";
                                }
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                    object.processingUnits = message.processingUnits;
                                    if (options.oneofs)
                                        object.computeCapacity = "processingUnits";
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ReplicaComputeCapacity to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ReplicaComputeCapacity.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ReplicaComputeCapacity
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ReplicaComputeCapacity
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ReplicaComputeCapacity.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ReplicaComputeCapacity";
                            };
    
                            return ReplicaComputeCapacity;
                        })();
    
                        v1.AutoscalingConfig = (function() {
    
                            /**
                             * Properties of an AutoscalingConfig.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IAutoscalingConfig
                             * @property {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits|null} [autoscalingLimits] AutoscalingConfig autoscalingLimits
                             * @property {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets|null} [autoscalingTargets] AutoscalingConfig autoscalingTargets
                             * @property {Array.<google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption>|null} [asymmetricAutoscalingOptions] AutoscalingConfig asymmetricAutoscalingOptions
                             */
    
                            /**
                             * Constructs a new AutoscalingConfig.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an AutoscalingConfig.
                             * @implements IAutoscalingConfig
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IAutoscalingConfig=} [properties] Properties to set
                             */
                            function AutoscalingConfig(properties) {
                                this.asymmetricAutoscalingOptions = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * AutoscalingConfig autoscalingLimits.
                             * @member {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits|null|undefined} autoscalingLimits
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @instance
                             */
                            AutoscalingConfig.prototype.autoscalingLimits = null;
    
                            /**
                             * AutoscalingConfig autoscalingTargets.
                             * @member {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets|null|undefined} autoscalingTargets
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @instance
                             */
                            AutoscalingConfig.prototype.autoscalingTargets = null;
    
                            /**
                             * AutoscalingConfig asymmetricAutoscalingOptions.
                             * @member {Array.<google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption>} asymmetricAutoscalingOptions
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @instance
                             */
                            AutoscalingConfig.prototype.asymmetricAutoscalingOptions = $util.emptyArray;
    
                            /**
                             * Creates a new AutoscalingConfig instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IAutoscalingConfig=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.AutoscalingConfig} AutoscalingConfig instance
                             */
                            AutoscalingConfig.create = function create(properties) {
                                return new AutoscalingConfig(properties);
                            };
    
                            /**
                             * Encodes the specified AutoscalingConfig message. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IAutoscalingConfig} message AutoscalingConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AutoscalingConfig.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.autoscalingLimits != null && Object.hasOwnProperty.call(message, "autoscalingLimits"))
                                    $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.encode(message.autoscalingLimits, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.autoscalingTargets != null && Object.hasOwnProperty.call(message, "autoscalingTargets"))
                                    $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.encode(message.autoscalingTargets, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.asymmetricAutoscalingOptions != null && message.asymmetricAutoscalingOptions.length)
                                    for (var i = 0; i < message.asymmetricAutoscalingOptions.length; ++i)
                                        $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.encode(message.asymmetricAutoscalingOptions[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified AutoscalingConfig message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.IAutoscalingConfig} message AutoscalingConfig message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            AutoscalingConfig.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an AutoscalingConfig message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.AutoscalingConfig} AutoscalingConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AutoscalingConfig.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.autoscalingTargets = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.asymmetricAutoscalingOptions && message.asymmetricAutoscalingOptions.length))
                                                message.asymmetricAutoscalingOptions = [];
                                            message.asymmetricAutoscalingOptions.push($root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an AutoscalingConfig message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.AutoscalingConfig} AutoscalingConfig
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            AutoscalingConfig.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an AutoscalingConfig message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            AutoscalingConfig.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.autoscalingLimits != null && message.hasOwnProperty("autoscalingLimits")) {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.verify(message.autoscalingLimits);
                                    if (error)
                                        return "autoscalingLimits." + error;
                                }
                                if (message.autoscalingTargets != null && message.hasOwnProperty("autoscalingTargets")) {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.verify(message.autoscalingTargets);
                                    if (error)
                                        return "autoscalingTargets." + error;
                                }
                                if (message.asymmetricAutoscalingOptions != null && message.hasOwnProperty("asymmetricAutoscalingOptions")) {
                                    if (!Array.isArray(message.asymmetricAutoscalingOptions))
                                        return "asymmetricAutoscalingOptions: array expected";
                                    for (var i = 0; i < message.asymmetricAutoscalingOptions.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.verify(message.asymmetricAutoscalingOptions[i]);
                                        if (error)
                                            return "asymmetricAutoscalingOptions." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates an AutoscalingConfig message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.AutoscalingConfig} AutoscalingConfig
                             */
                            AutoscalingConfig.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.AutoscalingConfig)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig();
                                if (object.autoscalingLimits != null) {
                                    if (typeof object.autoscalingLimits !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.autoscalingLimits: object expected");
                                    message.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.fromObject(object.autoscalingLimits);
                                }
                                if (object.autoscalingTargets != null) {
                                    if (typeof object.autoscalingTargets !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.autoscalingTargets: object expected");
                                    message.autoscalingTargets = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.fromObject(object.autoscalingTargets);
                                }
                                if (object.asymmetricAutoscalingOptions) {
                                    if (!Array.isArray(object.asymmetricAutoscalingOptions))
                                        throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.asymmetricAutoscalingOptions: array expected");
                                    message.asymmetricAutoscalingOptions = [];
                                    for (var i = 0; i < object.asymmetricAutoscalingOptions.length; ++i) {
                                        if (typeof object.asymmetricAutoscalingOptions[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.asymmetricAutoscalingOptions: object expected");
                                        message.asymmetricAutoscalingOptions[i] = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.fromObject(object.asymmetricAutoscalingOptions[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an AutoscalingConfig message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {google.spanner.admin.instance.v1.AutoscalingConfig} message AutoscalingConfig
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            AutoscalingConfig.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.asymmetricAutoscalingOptions = [];
                                if (options.defaults) {
                                    object.autoscalingLimits = null;
                                    object.autoscalingTargets = null;
                                }
                                if (message.autoscalingLimits != null && message.hasOwnProperty("autoscalingLimits"))
                                    object.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.toObject(message.autoscalingLimits, options);
                                if (message.autoscalingTargets != null && message.hasOwnProperty("autoscalingTargets"))
                                    object.autoscalingTargets = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.toObject(message.autoscalingTargets, options);
                                if (message.asymmetricAutoscalingOptions && message.asymmetricAutoscalingOptions.length) {
                                    object.asymmetricAutoscalingOptions = [];
                                    for (var j = 0; j < message.asymmetricAutoscalingOptions.length; ++j)
                                        object.asymmetricAutoscalingOptions[j] = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.toObject(message.asymmetricAutoscalingOptions[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this AutoscalingConfig to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            AutoscalingConfig.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for AutoscalingConfig
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            AutoscalingConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.AutoscalingConfig";
                            };
    
                            AutoscalingConfig.AutoscalingLimits = (function() {
    
                                /**
                                 * Properties of an AutoscalingLimits.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @interface IAutoscalingLimits
                                 * @property {number|null} [minNodes] AutoscalingLimits minNodes
                                 * @property {number|null} [minProcessingUnits] AutoscalingLimits minProcessingUnits
                                 * @property {number|null} [maxNodes] AutoscalingLimits maxNodes
                                 * @property {number|null} [maxProcessingUnits] AutoscalingLimits maxProcessingUnits
                                 */
    
                                /**
                                 * Constructs a new AutoscalingLimits.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @classdesc Represents an AutoscalingLimits.
                                 * @implements IAutoscalingLimits
                                 * @constructor
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits=} [properties] Properties to set
                                 */
                                function AutoscalingLimits(properties) {
                                    if (properties)
                                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                            if (properties[keys[i]] != null)
                                                this[keys[i]] = properties[keys[i]];
                                }
    
                                /**
                                 * AutoscalingLimits minNodes.
                                 * @member {number|null|undefined} minNodes
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                AutoscalingLimits.prototype.minNodes = null;
    
                                /**
                                 * AutoscalingLimits minProcessingUnits.
                                 * @member {number|null|undefined} minProcessingUnits
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                AutoscalingLimits.prototype.minProcessingUnits = null;
    
                                /**
                                 * AutoscalingLimits maxNodes.
                                 * @member {number|null|undefined} maxNodes
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                AutoscalingLimits.prototype.maxNodes = null;
    
                                /**
                                 * AutoscalingLimits maxProcessingUnits.
                                 * @member {number|null|undefined} maxProcessingUnits
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                AutoscalingLimits.prototype.maxProcessingUnits = null;
    
                                // OneOf field names bound to virtual getters and setters
                                var $oneOfFields;
    
                                /**
                                 * AutoscalingLimits minLimit.
                                 * @member {"minNodes"|"minProcessingUnits"|undefined} minLimit
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                Object.defineProperty(AutoscalingLimits.prototype, "minLimit", {
                                    get: $util.oneOfGetter($oneOfFields = ["minNodes", "minProcessingUnits"]),
                                    set: $util.oneOfSetter($oneOfFields)
                                });
    
                                /**
                                 * AutoscalingLimits maxLimit.
                                 * @member {"maxNodes"|"maxProcessingUnits"|undefined} maxLimit
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 */
                                Object.defineProperty(AutoscalingLimits.prototype, "maxLimit", {
                                    get: $util.oneOfGetter($oneOfFields = ["maxNodes", "maxProcessingUnits"]),
                                    set: $util.oneOfSetter($oneOfFields)
                                });
    
                                /**
                                 * Creates a new AutoscalingLimits instance using the specified properties.
                                 * @function create
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits=} [properties] Properties to set
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits} AutoscalingLimits instance
                                 */
                                AutoscalingLimits.create = function create(properties) {
                                    return new AutoscalingLimits(properties);
                                };
    
                                /**
                                 * Encodes the specified AutoscalingLimits message. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.verify|verify} messages.
                                 * @function encode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits} message AutoscalingLimits message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AutoscalingLimits.encode = function encode(message, writer) {
                                    if (!writer)
                                        writer = $Writer.create();
                                    if (message.minNodes != null && Object.hasOwnProperty.call(message, "minNodes"))
                                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.minNodes);
                                    if (message.minProcessingUnits != null && Object.hasOwnProperty.call(message, "minProcessingUnits"))
                                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.minProcessingUnits);
                                    if (message.maxNodes != null && Object.hasOwnProperty.call(message, "maxNodes"))
                                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.maxNodes);
                                    if (message.maxProcessingUnits != null && Object.hasOwnProperty.call(message, "maxProcessingUnits"))
                                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.maxProcessingUnits);
                                    return writer;
                                };
    
                                /**
                                 * Encodes the specified AutoscalingLimits message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.verify|verify} messages.
                                 * @function encodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits} message AutoscalingLimits message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AutoscalingLimits.encodeDelimited = function encodeDelimited(message, writer) {
                                    return this.encode(message, writer).ldelim();
                                };
    
                                /**
                                 * Decodes an AutoscalingLimits message from the specified reader or buffer.
                                 * @function decode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @param {number} [length] Message length if known beforehand
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits} AutoscalingLimits
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AutoscalingLimits.decode = function decode(reader, length, error) {
                                    if (!(reader instanceof $Reader))
                                        reader = $Reader.create(reader);
                                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits();
                                    while (reader.pos < end) {
                                        var tag = reader.uint32();
                                        if (tag === error)
                                            break;
                                        switch (tag >>> 3) {
                                        case 1: {
                                                message.minNodes = reader.int32();
                                                break;
                                            }
                                        case 2: {
                                                message.minProcessingUnits = reader.int32();
                                                break;
                                            }
                                        case 3: {
                                                message.maxNodes = reader.int32();
                                                break;
                                            }
                                        case 4: {
                                                message.maxProcessingUnits = reader.int32();
                                                break;
                                            }
                                        default:
                                            reader.skipType(tag & 7);
                                            break;
                                        }
                                    }
                                    return message;
                                };
    
                                /**
                                 * Decodes an AutoscalingLimits message from the specified reader or buffer, length delimited.
                                 * @function decodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits} AutoscalingLimits
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AutoscalingLimits.decodeDelimited = function decodeDelimited(reader) {
                                    if (!(reader instanceof $Reader))
                                        reader = new $Reader(reader);
                                    return this.decode(reader, reader.uint32());
                                };
    
                                /**
                                 * Verifies an AutoscalingLimits message.
                                 * @function verify
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {Object.<string,*>} message Plain object to verify
                                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                                 */
                                AutoscalingLimits.verify = function verify(message) {
                                    if (typeof message !== "object" || message === null)
                                        return "object expected";
                                    var properties = {};
                                    if (message.minNodes != null && message.hasOwnProperty("minNodes")) {
                                        properties.minLimit = 1;
                                        if (!$util.isInteger(message.minNodes))
                                            return "minNodes: integer expected";
                                    }
                                    if (message.minProcessingUnits != null && message.hasOwnProperty("minProcessingUnits")) {
                                        if (properties.minLimit === 1)
                                            return "minLimit: multiple values";
                                        properties.minLimit = 1;
                                        if (!$util.isInteger(message.minProcessingUnits))
                                            return "minProcessingUnits: integer expected";
                                    }
                                    if (message.maxNodes != null && message.hasOwnProperty("maxNodes")) {
                                        properties.maxLimit = 1;
                                        if (!$util.isInteger(message.maxNodes))
                                            return "maxNodes: integer expected";
                                    }
                                    if (message.maxProcessingUnits != null && message.hasOwnProperty("maxProcessingUnits")) {
                                        if (properties.maxLimit === 1)
                                            return "maxLimit: multiple values";
                                        properties.maxLimit = 1;
                                        if (!$util.isInteger(message.maxProcessingUnits))
                                            return "maxProcessingUnits: integer expected";
                                    }
                                    return null;
                                };
    
                                /**
                                 * Creates an AutoscalingLimits message from a plain object. Also converts values to their respective internal types.
                                 * @function fromObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {Object.<string,*>} object Plain object
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits} AutoscalingLimits
                                 */
                                AutoscalingLimits.fromObject = function fromObject(object) {
                                    if (object instanceof $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits)
                                        return object;
                                    var message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits();
                                    if (object.minNodes != null)
                                        message.minNodes = object.minNodes | 0;
                                    if (object.minProcessingUnits != null)
                                        message.minProcessingUnits = object.minProcessingUnits | 0;
                                    if (object.maxNodes != null)
                                        message.maxNodes = object.maxNodes | 0;
                                    if (object.maxProcessingUnits != null)
                                        message.maxProcessingUnits = object.maxProcessingUnits | 0;
                                    return message;
                                };
    
                                /**
                                 * Creates a plain object from an AutoscalingLimits message. Also converts values to other types if specified.
                                 * @function toObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits} message AutoscalingLimits
                                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                                 * @returns {Object.<string,*>} Plain object
                                 */
                                AutoscalingLimits.toObject = function toObject(message, options) {
                                    if (!options)
                                        options = {};
                                    var object = {};
                                    if (message.minNodes != null && message.hasOwnProperty("minNodes")) {
                                        object.minNodes = message.minNodes;
                                        if (options.oneofs)
                                            object.minLimit = "minNodes";
                                    }
                                    if (message.minProcessingUnits != null && message.hasOwnProperty("minProcessingUnits")) {
                                        object.minProcessingUnits = message.minProcessingUnits;
                                        if (options.oneofs)
                                            object.minLimit = "minProcessingUnits";
                                    }
                                    if (message.maxNodes != null && message.hasOwnProperty("maxNodes")) {
                                        object.maxNodes = message.maxNodes;
                                        if (options.oneofs)
                                            object.maxLimit = "maxNodes";
                                    }
                                    if (message.maxProcessingUnits != null && message.hasOwnProperty("maxProcessingUnits")) {
                                        object.maxProcessingUnits = message.maxProcessingUnits;
                                        if (options.oneofs)
                                            object.maxLimit = "maxProcessingUnits";
                                    }
                                    return object;
                                };
    
                                /**
                                 * Converts this AutoscalingLimits to JSON.
                                 * @function toJSON
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @instance
                                 * @returns {Object.<string,*>} JSON object
                                 */
                                AutoscalingLimits.prototype.toJSON = function toJSON() {
                                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                                };
    
                                /**
                                 * Gets the default type url for AutoscalingLimits
                                 * @function getTypeUrl
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits
                                 * @static
                                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                                 * @returns {string} The default type url
                                 */
                                AutoscalingLimits.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                    if (typeUrlPrefix === undefined) {
                                        typeUrlPrefix = "type.googleapis.com";
                                    }
                                    return typeUrlPrefix + "/google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits";
                                };
    
                                return AutoscalingLimits;
                            })();
    
                            AutoscalingConfig.AutoscalingTargets = (function() {
    
                                /**
                                 * Properties of an AutoscalingTargets.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @interface IAutoscalingTargets
                                 * @property {number|null} [highPriorityCpuUtilizationPercent] AutoscalingTargets highPriorityCpuUtilizationPercent
                                 * @property {number|null} [storageUtilizationPercent] AutoscalingTargets storageUtilizationPercent
                                 */
    
                                /**
                                 * Constructs a new AutoscalingTargets.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @classdesc Represents an AutoscalingTargets.
                                 * @implements IAutoscalingTargets
                                 * @constructor
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets=} [properties] Properties to set
                                 */
                                function AutoscalingTargets(properties) {
                                    if (properties)
                                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                            if (properties[keys[i]] != null)
                                                this[keys[i]] = properties[keys[i]];
                                }
    
                                /**
                                 * AutoscalingTargets highPriorityCpuUtilizationPercent.
                                 * @member {number} highPriorityCpuUtilizationPercent
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @instance
                                 */
                                AutoscalingTargets.prototype.highPriorityCpuUtilizationPercent = 0;
    
                                /**
                                 * AutoscalingTargets storageUtilizationPercent.
                                 * @member {number} storageUtilizationPercent
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @instance
                                 */
                                AutoscalingTargets.prototype.storageUtilizationPercent = 0;
    
                                /**
                                 * Creates a new AutoscalingTargets instance using the specified properties.
                                 * @function create
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets=} [properties] Properties to set
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets} AutoscalingTargets instance
                                 */
                                AutoscalingTargets.create = function create(properties) {
                                    return new AutoscalingTargets(properties);
                                };
    
                                /**
                                 * Encodes the specified AutoscalingTargets message. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.verify|verify} messages.
                                 * @function encode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets} message AutoscalingTargets message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AutoscalingTargets.encode = function encode(message, writer) {
                                    if (!writer)
                                        writer = $Writer.create();
                                    if (message.highPriorityCpuUtilizationPercent != null && Object.hasOwnProperty.call(message, "highPriorityCpuUtilizationPercent"))
                                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.highPriorityCpuUtilizationPercent);
                                    if (message.storageUtilizationPercent != null && Object.hasOwnProperty.call(message, "storageUtilizationPercent"))
                                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.storageUtilizationPercent);
                                    return writer;
                                };
    
                                /**
                                 * Encodes the specified AutoscalingTargets message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets.verify|verify} messages.
                                 * @function encodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingTargets} message AutoscalingTargets message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AutoscalingTargets.encodeDelimited = function encodeDelimited(message, writer) {
                                    return this.encode(message, writer).ldelim();
                                };
    
                                /**
                                 * Decodes an AutoscalingTargets message from the specified reader or buffer.
                                 * @function decode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @param {number} [length] Message length if known beforehand
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets} AutoscalingTargets
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AutoscalingTargets.decode = function decode(reader, length, error) {
                                    if (!(reader instanceof $Reader))
                                        reader = $Reader.create(reader);
                                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets();
                                    while (reader.pos < end) {
                                        var tag = reader.uint32();
                                        if (tag === error)
                                            break;
                                        switch (tag >>> 3) {
                                        case 1: {
                                                message.highPriorityCpuUtilizationPercent = reader.int32();
                                                break;
                                            }
                                        case 2: {
                                                message.storageUtilizationPercent = reader.int32();
                                                break;
                                            }
                                        default:
                                            reader.skipType(tag & 7);
                                            break;
                                        }
                                    }
                                    return message;
                                };
    
                                /**
                                 * Decodes an AutoscalingTargets message from the specified reader or buffer, length delimited.
                                 * @function decodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets} AutoscalingTargets
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AutoscalingTargets.decodeDelimited = function decodeDelimited(reader) {
                                    if (!(reader instanceof $Reader))
                                        reader = new $Reader(reader);
                                    return this.decode(reader, reader.uint32());
                                };
    
                                /**
                                 * Verifies an AutoscalingTargets message.
                                 * @function verify
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {Object.<string,*>} message Plain object to verify
                                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                                 */
                                AutoscalingTargets.verify = function verify(message) {
                                    if (typeof message !== "object" || message === null)
                                        return "object expected";
                                    if (message.highPriorityCpuUtilizationPercent != null && message.hasOwnProperty("highPriorityCpuUtilizationPercent"))
                                        if (!$util.isInteger(message.highPriorityCpuUtilizationPercent))
                                            return "highPriorityCpuUtilizationPercent: integer expected";
                                    if (message.storageUtilizationPercent != null && message.hasOwnProperty("storageUtilizationPercent"))
                                        if (!$util.isInteger(message.storageUtilizationPercent))
                                            return "storageUtilizationPercent: integer expected";
                                    return null;
                                };
    
                                /**
                                 * Creates an AutoscalingTargets message from a plain object. Also converts values to their respective internal types.
                                 * @function fromObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {Object.<string,*>} object Plain object
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets} AutoscalingTargets
                                 */
                                AutoscalingTargets.fromObject = function fromObject(object) {
                                    if (object instanceof $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets)
                                        return object;
                                    var message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets();
                                    if (object.highPriorityCpuUtilizationPercent != null)
                                        message.highPriorityCpuUtilizationPercent = object.highPriorityCpuUtilizationPercent | 0;
                                    if (object.storageUtilizationPercent != null)
                                        message.storageUtilizationPercent = object.storageUtilizationPercent | 0;
                                    return message;
                                };
    
                                /**
                                 * Creates a plain object from an AutoscalingTargets message. Also converts values to other types if specified.
                                 * @function toObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets} message AutoscalingTargets
                                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                                 * @returns {Object.<string,*>} Plain object
                                 */
                                AutoscalingTargets.toObject = function toObject(message, options) {
                                    if (!options)
                                        options = {};
                                    var object = {};
                                    if (options.defaults) {
                                        object.highPriorityCpuUtilizationPercent = 0;
                                        object.storageUtilizationPercent = 0;
                                    }
                                    if (message.highPriorityCpuUtilizationPercent != null && message.hasOwnProperty("highPriorityCpuUtilizationPercent"))
                                        object.highPriorityCpuUtilizationPercent = message.highPriorityCpuUtilizationPercent;
                                    if (message.storageUtilizationPercent != null && message.hasOwnProperty("storageUtilizationPercent"))
                                        object.storageUtilizationPercent = message.storageUtilizationPercent;
                                    return object;
                                };
    
                                /**
                                 * Converts this AutoscalingTargets to JSON.
                                 * @function toJSON
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @instance
                                 * @returns {Object.<string,*>} JSON object
                                 */
                                AutoscalingTargets.prototype.toJSON = function toJSON() {
                                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                                };
    
                                /**
                                 * Gets the default type url for AutoscalingTargets
                                 * @function getTypeUrl
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets
                                 * @static
                                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                                 * @returns {string} The default type url
                                 */
                                AutoscalingTargets.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                    if (typeUrlPrefix === undefined) {
                                        typeUrlPrefix = "type.googleapis.com";
                                    }
                                    return typeUrlPrefix + "/google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingTargets";
                                };
    
                                return AutoscalingTargets;
                            })();
    
                            AutoscalingConfig.AsymmetricAutoscalingOption = (function() {
    
                                /**
                                 * Properties of an AsymmetricAutoscalingOption.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @interface IAsymmetricAutoscalingOption
                                 * @property {google.spanner.admin.instance.v1.IReplicaSelection|null} [replicaSelection] AsymmetricAutoscalingOption replicaSelection
                                 * @property {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides|null} [overrides] AsymmetricAutoscalingOption overrides
                                 */
    
                                /**
                                 * Constructs a new AsymmetricAutoscalingOption.
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig
                                 * @classdesc Represents an AsymmetricAutoscalingOption.
                                 * @implements IAsymmetricAutoscalingOption
                                 * @constructor
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption=} [properties] Properties to set
                                 */
                                function AsymmetricAutoscalingOption(properties) {
                                    if (properties)
                                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                            if (properties[keys[i]] != null)
                                                this[keys[i]] = properties[keys[i]];
                                }
    
                                /**
                                 * AsymmetricAutoscalingOption replicaSelection.
                                 * @member {google.spanner.admin.instance.v1.IReplicaSelection|null|undefined} replicaSelection
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @instance
                                 */
                                AsymmetricAutoscalingOption.prototype.replicaSelection = null;
    
                                /**
                                 * AsymmetricAutoscalingOption overrides.
                                 * @member {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides|null|undefined} overrides
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @instance
                                 */
                                AsymmetricAutoscalingOption.prototype.overrides = null;
    
                                /**
                                 * Creates a new AsymmetricAutoscalingOption instance using the specified properties.
                                 * @function create
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption=} [properties] Properties to set
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption} AsymmetricAutoscalingOption instance
                                 */
                                AsymmetricAutoscalingOption.create = function create(properties) {
                                    return new AsymmetricAutoscalingOption(properties);
                                };
    
                                /**
                                 * Encodes the specified AsymmetricAutoscalingOption message. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.verify|verify} messages.
                                 * @function encode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption} message AsymmetricAutoscalingOption message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AsymmetricAutoscalingOption.encode = function encode(message, writer) {
                                    if (!writer)
                                        writer = $Writer.create();
                                    if (message.replicaSelection != null && Object.hasOwnProperty.call(message, "replicaSelection"))
                                        $root.google.spanner.admin.instance.v1.ReplicaSelection.encode(message.replicaSelection, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                    if (message.overrides != null && Object.hasOwnProperty.call(message, "overrides"))
                                        $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.encode(message.overrides, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                    return writer;
                                };
    
                                /**
                                 * Encodes the specified AsymmetricAutoscalingOption message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.verify|verify} messages.
                                 * @function encodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.IAsymmetricAutoscalingOption} message AsymmetricAutoscalingOption message or plain object to encode
                                 * @param {$protobuf.Writer} [writer] Writer to encode to
                                 * @returns {$protobuf.Writer} Writer
                                 */
                                AsymmetricAutoscalingOption.encodeDelimited = function encodeDelimited(message, writer) {
                                    return this.encode(message, writer).ldelim();
                                };
    
                                /**
                                 * Decodes an AsymmetricAutoscalingOption message from the specified reader or buffer.
                                 * @function decode
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @param {number} [length] Message length if known beforehand
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption} AsymmetricAutoscalingOption
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AsymmetricAutoscalingOption.decode = function decode(reader, length, error) {
                                    if (!(reader instanceof $Reader))
                                        reader = $Reader.create(reader);
                                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption();
                                    while (reader.pos < end) {
                                        var tag = reader.uint32();
                                        if (tag === error)
                                            break;
                                        switch (tag >>> 3) {
                                        case 1: {
                                                message.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.decode(reader, reader.uint32());
                                                break;
                                            }
                                        case 2: {
                                                message.overrides = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.decode(reader, reader.uint32());
                                                break;
                                            }
                                        default:
                                            reader.skipType(tag & 7);
                                            break;
                                        }
                                    }
                                    return message;
                                };
    
                                /**
                                 * Decodes an AsymmetricAutoscalingOption message from the specified reader or buffer, length delimited.
                                 * @function decodeDelimited
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption} AsymmetricAutoscalingOption
                                 * @throws {Error} If the payload is not a reader or valid buffer
                                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                 */
                                AsymmetricAutoscalingOption.decodeDelimited = function decodeDelimited(reader) {
                                    if (!(reader instanceof $Reader))
                                        reader = new $Reader(reader);
                                    return this.decode(reader, reader.uint32());
                                };
    
                                /**
                                 * Verifies an AsymmetricAutoscalingOption message.
                                 * @function verify
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {Object.<string,*>} message Plain object to verify
                                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                                 */
                                AsymmetricAutoscalingOption.verify = function verify(message) {
                                    if (typeof message !== "object" || message === null)
                                        return "object expected";
                                    if (message.replicaSelection != null && message.hasOwnProperty("replicaSelection")) {
                                        var error = $root.google.spanner.admin.instance.v1.ReplicaSelection.verify(message.replicaSelection);
                                        if (error)
                                            return "replicaSelection." + error;
                                    }
                                    if (message.overrides != null && message.hasOwnProperty("overrides")) {
                                        var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.verify(message.overrides);
                                        if (error)
                                            return "overrides." + error;
                                    }
                                    return null;
                                };
    
                                /**
                                 * Creates an AsymmetricAutoscalingOption message from a plain object. Also converts values to their respective internal types.
                                 * @function fromObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {Object.<string,*>} object Plain object
                                 * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption} AsymmetricAutoscalingOption
                                 */
                                AsymmetricAutoscalingOption.fromObject = function fromObject(object) {
                                    if (object instanceof $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption)
                                        return object;
                                    var message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption();
                                    if (object.replicaSelection != null) {
                                        if (typeof object.replicaSelection !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.replicaSelection: object expected");
                                        message.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.fromObject(object.replicaSelection);
                                    }
                                    if (object.overrides != null) {
                                        if (typeof object.overrides !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.overrides: object expected");
                                        message.overrides = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.fromObject(object.overrides);
                                    }
                                    return message;
                                };
    
                                /**
                                 * Creates a plain object from an AsymmetricAutoscalingOption message. Also converts values to other types if specified.
                                 * @function toObject
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption} message AsymmetricAutoscalingOption
                                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                                 * @returns {Object.<string,*>} Plain object
                                 */
                                AsymmetricAutoscalingOption.toObject = function toObject(message, options) {
                                    if (!options)
                                        options = {};
                                    var object = {};
                                    if (options.defaults) {
                                        object.replicaSelection = null;
                                        object.overrides = null;
                                    }
                                    if (message.replicaSelection != null && message.hasOwnProperty("replicaSelection"))
                                        object.replicaSelection = $root.google.spanner.admin.instance.v1.ReplicaSelection.toObject(message.replicaSelection, options);
                                    if (message.overrides != null && message.hasOwnProperty("overrides"))
                                        object.overrides = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.toObject(message.overrides, options);
                                    return object;
                                };
    
                                /**
                                 * Converts this AsymmetricAutoscalingOption to JSON.
                                 * @function toJSON
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @instance
                                 * @returns {Object.<string,*>} JSON object
                                 */
                                AsymmetricAutoscalingOption.prototype.toJSON = function toJSON() {
                                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                                };
    
                                /**
                                 * Gets the default type url for AsymmetricAutoscalingOption
                                 * @function getTypeUrl
                                 * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                 * @static
                                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                                 * @returns {string} The default type url
                                 */
                                AsymmetricAutoscalingOption.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                    if (typeUrlPrefix === undefined) {
                                        typeUrlPrefix = "type.googleapis.com";
                                    }
                                    return typeUrlPrefix + "/google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption";
                                };
    
                                AsymmetricAutoscalingOption.AutoscalingConfigOverrides = (function() {
    
                                    /**
                                     * Properties of an AutoscalingConfigOverrides.
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                     * @interface IAutoscalingConfigOverrides
                                     * @property {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits|null} [autoscalingLimits] AutoscalingConfigOverrides autoscalingLimits
                                     * @property {number|null} [autoscalingTargetHighPriorityCpuUtilizationPercent] AutoscalingConfigOverrides autoscalingTargetHighPriorityCpuUtilizationPercent
                                     */
    
                                    /**
                                     * Constructs a new AutoscalingConfigOverrides.
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption
                                     * @classdesc Represents an AutoscalingConfigOverrides.
                                     * @implements IAutoscalingConfigOverrides
                                     * @constructor
                                     * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides=} [properties] Properties to set
                                     */
                                    function AutoscalingConfigOverrides(properties) {
                                        if (properties)
                                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                                if (properties[keys[i]] != null)
                                                    this[keys[i]] = properties[keys[i]];
                                    }
    
                                    /**
                                     * AutoscalingConfigOverrides autoscalingLimits.
                                     * @member {google.spanner.admin.instance.v1.AutoscalingConfig.IAutoscalingLimits|null|undefined} autoscalingLimits
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @instance
                                     */
                                    AutoscalingConfigOverrides.prototype.autoscalingLimits = null;
    
                                    /**
                                     * AutoscalingConfigOverrides autoscalingTargetHighPriorityCpuUtilizationPercent.
                                     * @member {number} autoscalingTargetHighPriorityCpuUtilizationPercent
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @instance
                                     */
                                    AutoscalingConfigOverrides.prototype.autoscalingTargetHighPriorityCpuUtilizationPercent = 0;
    
                                    /**
                                     * Creates a new AutoscalingConfigOverrides instance using the specified properties.
                                     * @function create
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides=} [properties] Properties to set
                                     * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides} AutoscalingConfigOverrides instance
                                     */
                                    AutoscalingConfigOverrides.create = function create(properties) {
                                        return new AutoscalingConfigOverrides(properties);
                                    };
    
                                    /**
                                     * Encodes the specified AutoscalingConfigOverrides message. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.verify|verify} messages.
                                     * @function encode
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides} message AutoscalingConfigOverrides message or plain object to encode
                                     * @param {$protobuf.Writer} [writer] Writer to encode to
                                     * @returns {$protobuf.Writer} Writer
                                     */
                                    AutoscalingConfigOverrides.encode = function encode(message, writer) {
                                        if (!writer)
                                            writer = $Writer.create();
                                        if (message.autoscalingLimits != null && Object.hasOwnProperty.call(message, "autoscalingLimits"))
                                            $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.encode(message.autoscalingLimits, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                        if (message.autoscalingTargetHighPriorityCpuUtilizationPercent != null && Object.hasOwnProperty.call(message, "autoscalingTargetHighPriorityCpuUtilizationPercent"))
                                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.autoscalingTargetHighPriorityCpuUtilizationPercent);
                                        return writer;
                                    };
    
                                    /**
                                     * Encodes the specified AutoscalingConfigOverrides message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.verify|verify} messages.
                                     * @function encodeDelimited
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.IAutoscalingConfigOverrides} message AutoscalingConfigOverrides message or plain object to encode
                                     * @param {$protobuf.Writer} [writer] Writer to encode to
                                     * @returns {$protobuf.Writer} Writer
                                     */
                                    AutoscalingConfigOverrides.encodeDelimited = function encodeDelimited(message, writer) {
                                        return this.encode(message, writer).ldelim();
                                    };
    
                                    /**
                                     * Decodes an AutoscalingConfigOverrides message from the specified reader or buffer.
                                     * @function decode
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                     * @param {number} [length] Message length if known beforehand
                                     * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides} AutoscalingConfigOverrides
                                     * @throws {Error} If the payload is not a reader or valid buffer
                                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                     */
                                    AutoscalingConfigOverrides.decode = function decode(reader, length, error) {
                                        if (!(reader instanceof $Reader))
                                            reader = $Reader.create(reader);
                                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides();
                                        while (reader.pos < end) {
                                            var tag = reader.uint32();
                                            if (tag === error)
                                                break;
                                            switch (tag >>> 3) {
                                            case 1: {
                                                    message.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.decode(reader, reader.uint32());
                                                    break;
                                                }
                                            case 2: {
                                                    message.autoscalingTargetHighPriorityCpuUtilizationPercent = reader.int32();
                                                    break;
                                                }
                                            default:
                                                reader.skipType(tag & 7);
                                                break;
                                            }
                                        }
                                        return message;
                                    };
    
                                    /**
                                     * Decodes an AutoscalingConfigOverrides message from the specified reader or buffer, length delimited.
                                     * @function decodeDelimited
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                                     * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides} AutoscalingConfigOverrides
                                     * @throws {Error} If the payload is not a reader or valid buffer
                                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                                     */
                                    AutoscalingConfigOverrides.decodeDelimited = function decodeDelimited(reader) {
                                        if (!(reader instanceof $Reader))
                                            reader = new $Reader(reader);
                                        return this.decode(reader, reader.uint32());
                                    };
    
                                    /**
                                     * Verifies an AutoscalingConfigOverrides message.
                                     * @function verify
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {Object.<string,*>} message Plain object to verify
                                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                                     */
                                    AutoscalingConfigOverrides.verify = function verify(message) {
                                        if (typeof message !== "object" || message === null)
                                            return "object expected";
                                        if (message.autoscalingLimits != null && message.hasOwnProperty("autoscalingLimits")) {
                                            var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.verify(message.autoscalingLimits);
                                            if (error)
                                                return "autoscalingLimits." + error;
                                        }
                                        if (message.autoscalingTargetHighPriorityCpuUtilizationPercent != null && message.hasOwnProperty("autoscalingTargetHighPriorityCpuUtilizationPercent"))
                                            if (!$util.isInteger(message.autoscalingTargetHighPriorityCpuUtilizationPercent))
                                                return "autoscalingTargetHighPriorityCpuUtilizationPercent: integer expected";
                                        return null;
                                    };
    
                                    /**
                                     * Creates an AutoscalingConfigOverrides message from a plain object. Also converts values to their respective internal types.
                                     * @function fromObject
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {Object.<string,*>} object Plain object
                                     * @returns {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides} AutoscalingConfigOverrides
                                     */
                                    AutoscalingConfigOverrides.fromObject = function fromObject(object) {
                                        if (object instanceof $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides)
                                            return object;
                                        var message = new $root.google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides();
                                        if (object.autoscalingLimits != null) {
                                            if (typeof object.autoscalingLimits !== "object")
                                                throw TypeError(".google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides.autoscalingLimits: object expected");
                                            message.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.fromObject(object.autoscalingLimits);
                                        }
                                        if (object.autoscalingTargetHighPriorityCpuUtilizationPercent != null)
                                            message.autoscalingTargetHighPriorityCpuUtilizationPercent = object.autoscalingTargetHighPriorityCpuUtilizationPercent | 0;
                                        return message;
                                    };
    
                                    /**
                                     * Creates a plain object from an AutoscalingConfigOverrides message. Also converts values to other types if specified.
                                     * @function toObject
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides} message AutoscalingConfigOverrides
                                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                                     * @returns {Object.<string,*>} Plain object
                                     */
                                    AutoscalingConfigOverrides.toObject = function toObject(message, options) {
                                        if (!options)
                                            options = {};
                                        var object = {};
                                        if (options.defaults) {
                                            object.autoscalingLimits = null;
                                            object.autoscalingTargetHighPriorityCpuUtilizationPercent = 0;
                                        }
                                        if (message.autoscalingLimits != null && message.hasOwnProperty("autoscalingLimits"))
                                            object.autoscalingLimits = $root.google.spanner.admin.instance.v1.AutoscalingConfig.AutoscalingLimits.toObject(message.autoscalingLimits, options);
                                        if (message.autoscalingTargetHighPriorityCpuUtilizationPercent != null && message.hasOwnProperty("autoscalingTargetHighPriorityCpuUtilizationPercent"))
                                            object.autoscalingTargetHighPriorityCpuUtilizationPercent = message.autoscalingTargetHighPriorityCpuUtilizationPercent;
                                        return object;
                                    };
    
                                    /**
                                     * Converts this AutoscalingConfigOverrides to JSON.
                                     * @function toJSON
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @instance
                                     * @returns {Object.<string,*>} JSON object
                                     */
                                    AutoscalingConfigOverrides.prototype.toJSON = function toJSON() {
                                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                                    };
    
                                    /**
                                     * Gets the default type url for AutoscalingConfigOverrides
                                     * @function getTypeUrl
                                     * @memberof google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides
                                     * @static
                                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                                     * @returns {string} The default type url
                                     */
                                    AutoscalingConfigOverrides.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                        if (typeUrlPrefix === undefined) {
                                            typeUrlPrefix = "type.googleapis.com";
                                        }
                                        return typeUrlPrefix + "/google.spanner.admin.instance.v1.AutoscalingConfig.AsymmetricAutoscalingOption.AutoscalingConfigOverrides";
                                    };
    
                                    return AutoscalingConfigOverrides;
                                })();
    
                                return AsymmetricAutoscalingOption;
                            })();
    
                            return AutoscalingConfig;
                        })();
    
                        v1.Instance = (function() {
    
                            /**
                             * Properties of an Instance.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IInstance
                             * @property {string|null} [name] Instance name
                             * @property {string|null} [config] Instance config
                             * @property {string|null} [displayName] Instance displayName
                             * @property {number|null} [nodeCount] Instance nodeCount
                             * @property {number|null} [processingUnits] Instance processingUnits
                             * @property {Array.<google.spanner.admin.instance.v1.IReplicaComputeCapacity>|null} [replicaComputeCapacity] Instance replicaComputeCapacity
                             * @property {google.spanner.admin.instance.v1.IAutoscalingConfig|null} [autoscalingConfig] Instance autoscalingConfig
                             * @property {google.spanner.admin.instance.v1.Instance.State|null} [state] Instance state
                             * @property {Object.<string,string>|null} [labels] Instance labels
                             * @property {google.spanner.admin.instance.v1.Instance.InstanceType|null} [instanceType] Instance instanceType
                             * @property {Array.<string>|null} [endpointUris] Instance endpointUris
                             * @property {google.protobuf.ITimestamp|null} [createTime] Instance createTime
                             * @property {google.protobuf.ITimestamp|null} [updateTime] Instance updateTime
                             * @property {google.spanner.admin.instance.v1.IFreeInstanceMetadata|null} [freeInstanceMetadata] Instance freeInstanceMetadata
                             * @property {google.spanner.admin.instance.v1.Instance.Edition|null} [edition] Instance edition
                             * @property {google.spanner.admin.instance.v1.Instance.DefaultBackupScheduleType|null} [defaultBackupScheduleType] Instance defaultBackupScheduleType
                             */
    
                            /**
                             * Constructs a new Instance.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an Instance.
                             * @implements IInstance
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IInstance=} [properties] Properties to set
                             */
                            function Instance(properties) {
                                this.replicaComputeCapacity = [];
                                this.labels = {};
                                this.endpointUris = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Instance name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.name = "";
    
                            /**
                             * Instance config.
                             * @member {string} config
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.config = "";
    
                            /**
                             * Instance displayName.
                             * @member {string} displayName
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.displayName = "";
    
                            /**
                             * Instance nodeCount.
                             * @member {number} nodeCount
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.nodeCount = 0;
    
                            /**
                             * Instance processingUnits.
                             * @member {number} processingUnits
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.processingUnits = 0;
    
                            /**
                             * Instance replicaComputeCapacity.
                             * @member {Array.<google.spanner.admin.instance.v1.IReplicaComputeCapacity>} replicaComputeCapacity
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.replicaComputeCapacity = $util.emptyArray;
    
                            /**
                             * Instance autoscalingConfig.
                             * @member {google.spanner.admin.instance.v1.IAutoscalingConfig|null|undefined} autoscalingConfig
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.autoscalingConfig = null;
    
                            /**
                             * Instance state.
                             * @member {google.spanner.admin.instance.v1.Instance.State} state
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.state = 0;
    
                            /**
                             * Instance labels.
                             * @member {Object.<string,string>} labels
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.labels = $util.emptyObject;
    
                            /**
                             * Instance instanceType.
                             * @member {google.spanner.admin.instance.v1.Instance.InstanceType} instanceType
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.instanceType = 0;
    
                            /**
                             * Instance endpointUris.
                             * @member {Array.<string>} endpointUris
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.endpointUris = $util.emptyArray;
    
                            /**
                             * Instance createTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} createTime
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.createTime = null;
    
                            /**
                             * Instance updateTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.updateTime = null;
    
                            /**
                             * Instance freeInstanceMetadata.
                             * @member {google.spanner.admin.instance.v1.IFreeInstanceMetadata|null|undefined} freeInstanceMetadata
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.freeInstanceMetadata = null;
    
                            /**
                             * Instance edition.
                             * @member {google.spanner.admin.instance.v1.Instance.Edition} edition
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.edition = 0;
    
                            /**
                             * Instance defaultBackupScheduleType.
                             * @member {google.spanner.admin.instance.v1.Instance.DefaultBackupScheduleType} defaultBackupScheduleType
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             */
                            Instance.prototype.defaultBackupScheduleType = 0;
    
                            /**
                             * Creates a new Instance instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstance=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.Instance} Instance instance
                             */
                            Instance.create = function create(properties) {
                                return new Instance(properties);
                            };
    
                            /**
                             * Encodes the specified Instance message. Does not implicitly {@link google.spanner.admin.instance.v1.Instance.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstance} message Instance message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Instance.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.config != null && Object.hasOwnProperty.call(message, "config"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.config);
                                if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.displayName);
                                if (message.nodeCount != null && Object.hasOwnProperty.call(message, "nodeCount"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.nodeCount);
                                if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                                    writer.uint32(/* id 6, wireType 0 =*/48).int32(message.state);
                                if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                                    for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                        writer.uint32(/* id 7, wireType 2 =*/58).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                                if (message.endpointUris != null && message.endpointUris.length)
                                    for (var i = 0; i < message.endpointUris.length; ++i)
                                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.endpointUris[i]);
                                if (message.processingUnits != null && Object.hasOwnProperty.call(message, "processingUnits"))
                                    writer.uint32(/* id 9, wireType 0 =*/72).int32(message.processingUnits);
                                if (message.instanceType != null && Object.hasOwnProperty.call(message, "instanceType"))
                                    writer.uint32(/* id 10, wireType 0 =*/80).int32(message.instanceType);
                                if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                                    $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                                if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                                    $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                                if (message.freeInstanceMetadata != null && Object.hasOwnProperty.call(message, "freeInstanceMetadata"))
                                    $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.encode(message.freeInstanceMetadata, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
                                if (message.autoscalingConfig != null && Object.hasOwnProperty.call(message, "autoscalingConfig"))
                                    $root.google.spanner.admin.instance.v1.AutoscalingConfig.encode(message.autoscalingConfig, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim();
                                if (message.replicaComputeCapacity != null && message.replicaComputeCapacity.length)
                                    for (var i = 0; i < message.replicaComputeCapacity.length; ++i)
                                        $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity.encode(message.replicaComputeCapacity[i], writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim();
                                if (message.edition != null && Object.hasOwnProperty.call(message, "edition"))
                                    writer.uint32(/* id 20, wireType 0 =*/160).int32(message.edition);
                                if (message.defaultBackupScheduleType != null && Object.hasOwnProperty.call(message, "defaultBackupScheduleType"))
                                    writer.uint32(/* id 23, wireType 0 =*/184).int32(message.defaultBackupScheduleType);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Instance message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.Instance.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstance} message Instance message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Instance.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an Instance message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.Instance} Instance
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Instance.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.Instance(), key, value;
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.config = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.displayName = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.nodeCount = reader.int32();
                                            break;
                                        }
                                    case 9: {
                                            message.processingUnits = reader.int32();
                                            break;
                                        }
                                    case 19: {
                                            if (!(message.replicaComputeCapacity && message.replicaComputeCapacity.length))
                                                message.replicaComputeCapacity = [];
                                            message.replicaComputeCapacity.push($root.google.spanner.admin.instance.v1.ReplicaComputeCapacity.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 17: {
                                            message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 6: {
                                            message.state = reader.int32();
                                            break;
                                        }
                                    case 7: {
                                            if (message.labels === $util.emptyObject)
                                                message.labels = {};
                                            var end2 = reader.uint32() + reader.pos;
                                            key = "";
                                            value = "";
                                            while (reader.pos < end2) {
                                                var tag2 = reader.uint32();
                                                switch (tag2 >>> 3) {
                                                case 1:
                                                    key = reader.string();
                                                    break;
                                                case 2:
                                                    value = reader.string();
                                                    break;
                                                default:
                                                    reader.skipType(tag2 & 7);
                                                    break;
                                                }
                                            }
                                            message.labels[key] = value;
                                            break;
                                        }
                                    case 10: {
                                            message.instanceType = reader.int32();
                                            break;
                                        }
                                    case 8: {
                                            if (!(message.endpointUris && message.endpointUris.length))
                                                message.endpointUris = [];
                                            message.endpointUris.push(reader.string());
                                            break;
                                        }
                                    case 11: {
                                            message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 12: {
                                            message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 13: {
                                            message.freeInstanceMetadata = $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 20: {
                                            message.edition = reader.int32();
                                            break;
                                        }
                                    case 23: {
                                            message.defaultBackupScheduleType = reader.int32();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an Instance message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.Instance} Instance
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Instance.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an Instance message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Instance.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.config != null && message.hasOwnProperty("config"))
                                    if (!$util.isString(message.config))
                                        return "config: string expected";
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    if (!$util.isString(message.displayName))
                                        return "displayName: string expected";
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount"))
                                    if (!$util.isInteger(message.nodeCount))
                                        return "nodeCount: integer expected";
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits"))
                                    if (!$util.isInteger(message.processingUnits))
                                        return "processingUnits: integer expected";
                                if (message.replicaComputeCapacity != null && message.hasOwnProperty("replicaComputeCapacity")) {
                                    if (!Array.isArray(message.replicaComputeCapacity))
                                        return "replicaComputeCapacity: array expected";
                                    for (var i = 0; i < message.replicaComputeCapacity.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity.verify(message.replicaComputeCapacity[i]);
                                        if (error)
                                            return "replicaComputeCapacity." + error;
                                    }
                                }
                                if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.verify(message.autoscalingConfig);
                                    if (error)
                                        return "autoscalingConfig." + error;
                                }
                                if (message.state != null && message.hasOwnProperty("state"))
                                    switch (message.state) {
                                    default:
                                        return "state: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.labels != null && message.hasOwnProperty("labels")) {
                                    if (!$util.isObject(message.labels))
                                        return "labels: object expected";
                                    var key = Object.keys(message.labels);
                                    for (var i = 0; i < key.length; ++i)
                                        if (!$util.isString(message.labels[key[i]]))
                                            return "labels: string{k:string} expected";
                                }
                                if (message.instanceType != null && message.hasOwnProperty("instanceType"))
                                    switch (message.instanceType) {
                                    default:
                                        return "instanceType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.endpointUris != null && message.hasOwnProperty("endpointUris")) {
                                    if (!Array.isArray(message.endpointUris))
                                        return "endpointUris: array expected";
                                    for (var i = 0; i < message.endpointUris.length; ++i)
                                        if (!$util.isString(message.endpointUris[i]))
                                            return "endpointUris: string[] expected";
                                }
                                if (message.createTime != null && message.hasOwnProperty("createTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                                    if (error)
                                        return "createTime." + error;
                                }
                                if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                                    if (error)
                                        return "updateTime." + error;
                                }
                                if (message.freeInstanceMetadata != null && message.hasOwnProperty("freeInstanceMetadata")) {
                                    var error = $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.verify(message.freeInstanceMetadata);
                                    if (error)
                                        return "freeInstanceMetadata." + error;
                                }
                                if (message.edition != null && message.hasOwnProperty("edition"))
                                    switch (message.edition) {
                                    default:
                                        return "edition: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                if (message.defaultBackupScheduleType != null && message.hasOwnProperty("defaultBackupScheduleType"))
                                    switch (message.defaultBackupScheduleType) {
                                    default:
                                        return "defaultBackupScheduleType: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                return null;
                            };
    
                            /**
                             * Creates an Instance message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.Instance} Instance
                             */
                            Instance.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.Instance)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.Instance();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.config != null)
                                    message.config = String(object.config);
                                if (object.displayName != null)
                                    message.displayName = String(object.displayName);
                                if (object.nodeCount != null)
                                    message.nodeCount = object.nodeCount | 0;
                                if (object.processingUnits != null)
                                    message.processingUnits = object.processingUnits | 0;
                                if (object.replicaComputeCapacity) {
                                    if (!Array.isArray(object.replicaComputeCapacity))
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.replicaComputeCapacity: array expected");
                                    message.replicaComputeCapacity = [];
                                    for (var i = 0; i < object.replicaComputeCapacity.length; ++i) {
                                        if (typeof object.replicaComputeCapacity[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.Instance.replicaComputeCapacity: object expected");
                                        message.replicaComputeCapacity[i] = $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity.fromObject(object.replicaComputeCapacity[i]);
                                    }
                                }
                                if (object.autoscalingConfig != null) {
                                    if (typeof object.autoscalingConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.autoscalingConfig: object expected");
                                    message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.fromObject(object.autoscalingConfig);
                                }
                                switch (object.state) {
                                default:
                                    if (typeof object.state === "number") {
                                        message.state = object.state;
                                        break;
                                    }
                                    break;
                                case "STATE_UNSPECIFIED":
                                case 0:
                                    message.state = 0;
                                    break;
                                case "CREATING":
                                case 1:
                                    message.state = 1;
                                    break;
                                case "READY":
                                case 2:
                                    message.state = 2;
                                    break;
                                }
                                if (object.labels) {
                                    if (typeof object.labels !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.labels: object expected");
                                    message.labels = {};
                                    for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                        message.labels[keys[i]] = String(object.labels[keys[i]]);
                                }
                                switch (object.instanceType) {
                                default:
                                    if (typeof object.instanceType === "number") {
                                        message.instanceType = object.instanceType;
                                        break;
                                    }
                                    break;
                                case "INSTANCE_TYPE_UNSPECIFIED":
                                case 0:
                                    message.instanceType = 0;
                                    break;
                                case "PROVISIONED":
                                case 1:
                                    message.instanceType = 1;
                                    break;
                                case "FREE_INSTANCE":
                                case 2:
                                    message.instanceType = 2;
                                    break;
                                }
                                if (object.endpointUris) {
                                    if (!Array.isArray(object.endpointUris))
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.endpointUris: array expected");
                                    message.endpointUris = [];
                                    for (var i = 0; i < object.endpointUris.length; ++i)
                                        message.endpointUris[i] = String(object.endpointUris[i]);
                                }
                                if (object.createTime != null) {
                                    if (typeof object.createTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.createTime: object expected");
                                    message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                                }
                                if (object.updateTime != null) {
                                    if (typeof object.updateTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.updateTime: object expected");
                                    message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                                }
                                if (object.freeInstanceMetadata != null) {
                                    if (typeof object.freeInstanceMetadata !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.Instance.freeInstanceMetadata: object expected");
                                    message.freeInstanceMetadata = $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.fromObject(object.freeInstanceMetadata);
                                }
                                switch (object.edition) {
                                default:
                                    if (typeof object.edition === "number") {
                                        message.edition = object.edition;
                                        break;
                                    }
                                    break;
                                case "EDITION_UNSPECIFIED":
                                case 0:
                                    message.edition = 0;
                                    break;
                                case "STANDARD":
                                case 1:
                                    message.edition = 1;
                                    break;
                                case "ENTERPRISE":
                                case 2:
                                    message.edition = 2;
                                    break;
                                case "ENTERPRISE_PLUS":
                                case 3:
                                    message.edition = 3;
                                    break;
                                }
                                switch (object.defaultBackupScheduleType) {
                                default:
                                    if (typeof object.defaultBackupScheduleType === "number") {
                                        message.defaultBackupScheduleType = object.defaultBackupScheduleType;
                                        break;
                                    }
                                    break;
                                case "DEFAULT_BACKUP_SCHEDULE_TYPE_UNSPECIFIED":
                                case 0:
                                    message.defaultBackupScheduleType = 0;
                                    break;
                                case "NONE":
                                case 1:
                                    message.defaultBackupScheduleType = 1;
                                    break;
                                case "AUTOMATIC":
                                case 2:
                                    message.defaultBackupScheduleType = 2;
                                    break;
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an Instance message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {google.spanner.admin.instance.v1.Instance} message Instance
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Instance.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.endpointUris = [];
                                    object.replicaComputeCapacity = [];
                                }
                                if (options.objects || options.defaults)
                                    object.labels = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.config = "";
                                    object.displayName = "";
                                    object.nodeCount = 0;
                                    object.state = options.enums === String ? "STATE_UNSPECIFIED" : 0;
                                    object.processingUnits = 0;
                                    object.instanceType = options.enums === String ? "INSTANCE_TYPE_UNSPECIFIED" : 0;
                                    object.createTime = null;
                                    object.updateTime = null;
                                    object.freeInstanceMetadata = null;
                                    object.autoscalingConfig = null;
                                    object.edition = options.enums === String ? "EDITION_UNSPECIFIED" : 0;
                                    object.defaultBackupScheduleType = options.enums === String ? "DEFAULT_BACKUP_SCHEDULE_TYPE_UNSPECIFIED" : 0;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.config != null && message.hasOwnProperty("config"))
                                    object.config = message.config;
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    object.displayName = message.displayName;
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount"))
                                    object.nodeCount = message.nodeCount;
                                if (message.state != null && message.hasOwnProperty("state"))
                                    object.state = options.enums === String ? $root.google.spanner.admin.instance.v1.Instance.State[message.state] === undefined ? message.state : $root.google.spanner.admin.instance.v1.Instance.State[message.state] : message.state;
                                var keys2;
                                if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                                    object.labels = {};
                                    for (var j = 0; j < keys2.length; ++j)
                                        object.labels[keys2[j]] = message.labels[keys2[j]];
                                }
                                if (message.endpointUris && message.endpointUris.length) {
                                    object.endpointUris = [];
                                    for (var j = 0; j < message.endpointUris.length; ++j)
                                        object.endpointUris[j] = message.endpointUris[j];
                                }
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits"))
                                    object.processingUnits = message.processingUnits;
                                if (message.instanceType != null && message.hasOwnProperty("instanceType"))
                                    object.instanceType = options.enums === String ? $root.google.spanner.admin.instance.v1.Instance.InstanceType[message.instanceType] === undefined ? message.instanceType : $root.google.spanner.admin.instance.v1.Instance.InstanceType[message.instanceType] : message.instanceType;
                                if (message.createTime != null && message.hasOwnProperty("createTime"))
                                    object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                                if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                                    object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                                if (message.freeInstanceMetadata != null && message.hasOwnProperty("freeInstanceMetadata"))
                                    object.freeInstanceMetadata = $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.toObject(message.freeInstanceMetadata, options);
                                if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig"))
                                    object.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.toObject(message.autoscalingConfig, options);
                                if (message.replicaComputeCapacity && message.replicaComputeCapacity.length) {
                                    object.replicaComputeCapacity = [];
                                    for (var j = 0; j < message.replicaComputeCapacity.length; ++j)
                                        object.replicaComputeCapacity[j] = $root.google.spanner.admin.instance.v1.ReplicaComputeCapacity.toObject(message.replicaComputeCapacity[j], options);
                                }
                                if (message.edition != null && message.hasOwnProperty("edition"))
                                    object.edition = options.enums === String ? $root.google.spanner.admin.instance.v1.Instance.Edition[message.edition] === undefined ? message.edition : $root.google.spanner.admin.instance.v1.Instance.Edition[message.edition] : message.edition;
                                if (message.defaultBackupScheduleType != null && message.hasOwnProperty("defaultBackupScheduleType"))
                                    object.defaultBackupScheduleType = options.enums === String ? $root.google.spanner.admin.instance.v1.Instance.DefaultBackupScheduleType[message.defaultBackupScheduleType] === undefined ? message.defaultBackupScheduleType : $root.google.spanner.admin.instance.v1.Instance.DefaultBackupScheduleType[message.defaultBackupScheduleType] : message.defaultBackupScheduleType;
                                return object;
                            };
    
                            /**
                             * Converts this Instance to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Instance.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Instance
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.Instance
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Instance.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.Instance";
                            };
    
                            /**
                             * State enum.
                             * @name google.spanner.admin.instance.v1.Instance.State
                             * @enum {number}
                             * @property {number} STATE_UNSPECIFIED=0 STATE_UNSPECIFIED value
                             * @property {number} CREATING=1 CREATING value
                             * @property {number} READY=2 READY value
                             */
                            Instance.State = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "STATE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "CREATING"] = 1;
                                values[valuesById[2] = "READY"] = 2;
                                return values;
                            })();
    
                            /**
                             * InstanceType enum.
                             * @name google.spanner.admin.instance.v1.Instance.InstanceType
                             * @enum {number}
                             * @property {number} INSTANCE_TYPE_UNSPECIFIED=0 INSTANCE_TYPE_UNSPECIFIED value
                             * @property {number} PROVISIONED=1 PROVISIONED value
                             * @property {number} FREE_INSTANCE=2 FREE_INSTANCE value
                             */
                            Instance.InstanceType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "INSTANCE_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "PROVISIONED"] = 1;
                                values[valuesById[2] = "FREE_INSTANCE"] = 2;
                                return values;
                            })();
    
                            /**
                             * Edition enum.
                             * @name google.spanner.admin.instance.v1.Instance.Edition
                             * @enum {number}
                             * @property {number} EDITION_UNSPECIFIED=0 EDITION_UNSPECIFIED value
                             * @property {number} STANDARD=1 STANDARD value
                             * @property {number} ENTERPRISE=2 ENTERPRISE value
                             * @property {number} ENTERPRISE_PLUS=3 ENTERPRISE_PLUS value
                             */
                            Instance.Edition = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "EDITION_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "STANDARD"] = 1;
                                values[valuesById[2] = "ENTERPRISE"] = 2;
                                values[valuesById[3] = "ENTERPRISE_PLUS"] = 3;
                                return values;
                            })();
    
                            /**
                             * DefaultBackupScheduleType enum.
                             * @name google.spanner.admin.instance.v1.Instance.DefaultBackupScheduleType
                             * @enum {number}
                             * @property {number} DEFAULT_BACKUP_SCHEDULE_TYPE_UNSPECIFIED=0 DEFAULT_BACKUP_SCHEDULE_TYPE_UNSPECIFIED value
                             * @property {number} NONE=1 NONE value
                             * @property {number} AUTOMATIC=2 AUTOMATIC value
                             */
                            Instance.DefaultBackupScheduleType = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "DEFAULT_BACKUP_SCHEDULE_TYPE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "NONE"] = 1;
                                values[valuesById[2] = "AUTOMATIC"] = 2;
                                return values;
                            })();
    
                            return Instance;
                        })();
    
                        v1.ListInstanceConfigsRequest = (function() {
    
                            /**
                             * Properties of a ListInstanceConfigsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstanceConfigsRequest
                             * @property {string|null} [parent] ListInstanceConfigsRequest parent
                             * @property {number|null} [pageSize] ListInstanceConfigsRequest pageSize
                             * @property {string|null} [pageToken] ListInstanceConfigsRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListInstanceConfigsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstanceConfigsRequest.
                             * @implements IListInstanceConfigsRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest=} [properties] Properties to set
                             */
                            function ListInstanceConfigsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstanceConfigsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @instance
                             */
                            ListInstanceConfigsRequest.prototype.parent = "";
    
                            /**
                             * ListInstanceConfigsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @instance
                             */
                            ListInstanceConfigsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListInstanceConfigsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @instance
                             */
                            ListInstanceConfigsRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListInstanceConfigsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsRequest} ListInstanceConfigsRequest instance
                             */
                            ListInstanceConfigsRequest.create = function create(properties) {
                                return new ListInstanceConfigsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigsRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest} message ListInstanceConfigsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsRequest} message ListInstanceConfigsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstanceConfigsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsRequest} ListInstanceConfigsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstanceConfigsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsRequest} ListInstanceConfigsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstanceConfigsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstanceConfigsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListInstanceConfigsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsRequest} ListInstanceConfigsRequest
                             */
                            ListInstanceConfigsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstanceConfigsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstanceConfigsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigsRequest} message ListInstanceConfigsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstanceConfigsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListInstanceConfigsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstanceConfigsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstanceConfigsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstanceConfigsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstanceConfigsRequest";
                            };
    
                            return ListInstanceConfigsRequest;
                        })();
    
                        v1.ListInstanceConfigsResponse = (function() {
    
                            /**
                             * Properties of a ListInstanceConfigsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstanceConfigsResponse
                             * @property {Array.<google.spanner.admin.instance.v1.IInstanceConfig>|null} [instanceConfigs] ListInstanceConfigsResponse instanceConfigs
                             * @property {string|null} [nextPageToken] ListInstanceConfigsResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListInstanceConfigsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstanceConfigsResponse.
                             * @implements IListInstanceConfigsResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsResponse=} [properties] Properties to set
                             */
                            function ListInstanceConfigsResponse(properties) {
                                this.instanceConfigs = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstanceConfigsResponse instanceConfigs.
                             * @member {Array.<google.spanner.admin.instance.v1.IInstanceConfig>} instanceConfigs
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @instance
                             */
                            ListInstanceConfigsResponse.prototype.instanceConfigs = $util.emptyArray;
    
                            /**
                             * ListInstanceConfigsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @instance
                             */
                            ListInstanceConfigsResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListInstanceConfigsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} ListInstanceConfigsResponse instance
                             */
                            ListInstanceConfigsResponse.create = function create(properties) {
                                return new ListInstanceConfigsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigsResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsResponse} message ListInstanceConfigsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instanceConfigs != null && message.instanceConfigs.length)
                                    for (var i = 0; i < message.instanceConfigs.length; ++i)
                                        $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfigs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigsResponse} message ListInstanceConfigsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstanceConfigsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} ListInstanceConfigsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.instanceConfigs && message.instanceConfigs.length))
                                                message.instanceConfigs = [];
                                            message.instanceConfigs.push($root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstanceConfigsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} ListInstanceConfigsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstanceConfigsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstanceConfigsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instanceConfigs != null && message.hasOwnProperty("instanceConfigs")) {
                                    if (!Array.isArray(message.instanceConfigs))
                                        return "instanceConfigs: array expected";
                                    for (var i = 0; i < message.instanceConfigs.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfigs[i]);
                                        if (error)
                                            return "instanceConfigs." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListInstanceConfigsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} ListInstanceConfigsResponse
                             */
                            ListInstanceConfigsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstanceConfigsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigsResponse();
                                if (object.instanceConfigs) {
                                    if (!Array.isArray(object.instanceConfigs))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstanceConfigsResponse.instanceConfigs: array expected");
                                    message.instanceConfigs = [];
                                    for (var i = 0; i < object.instanceConfigs.length; ++i) {
                                        if (typeof object.instanceConfigs[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.ListInstanceConfigsResponse.instanceConfigs: object expected");
                                        message.instanceConfigs[i] = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfigs[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstanceConfigsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigsResponse} message ListInstanceConfigsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstanceConfigsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.instanceConfigs = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.instanceConfigs && message.instanceConfigs.length) {
                                    object.instanceConfigs = [];
                                    for (var j = 0; j < message.instanceConfigs.length; ++j)
                                        object.instanceConfigs[j] = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfigs[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListInstanceConfigsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstanceConfigsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstanceConfigsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstanceConfigsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstanceConfigsResponse";
                            };
    
                            return ListInstanceConfigsResponse;
                        })();
    
                        v1.GetInstanceConfigRequest = (function() {
    
                            /**
                             * Properties of a GetInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IGetInstanceConfigRequest
                             * @property {string|null} [name] GetInstanceConfigRequest name
                             */
    
                            /**
                             * Constructs a new GetInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a GetInstanceConfigRequest.
                             * @implements IGetInstanceConfigRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest=} [properties] Properties to set
                             */
                            function GetInstanceConfigRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetInstanceConfigRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @instance
                             */
                            GetInstanceConfigRequest.prototype.name = "";
    
                            /**
                             * Creates a new GetInstanceConfigRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.GetInstanceConfigRequest} GetInstanceConfigRequest instance
                             */
                            GetInstanceConfigRequest.create = function create(properties) {
                                return new GetInstanceConfigRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetInstanceConfigRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstanceConfigRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest} message GetInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstanceConfigRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetInstanceConfigRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstanceConfigRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceConfigRequest} message GetInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstanceConfigRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetInstanceConfigRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.GetInstanceConfigRequest} GetInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstanceConfigRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.GetInstanceConfigRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetInstanceConfigRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.GetInstanceConfigRequest} GetInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstanceConfigRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetInstanceConfigRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetInstanceConfigRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetInstanceConfigRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.GetInstanceConfigRequest} GetInstanceConfigRequest
                             */
                            GetInstanceConfigRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.GetInstanceConfigRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.GetInstanceConfigRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetInstanceConfigRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.GetInstanceConfigRequest} message GetInstanceConfigRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetInstanceConfigRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this GetInstanceConfigRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetInstanceConfigRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetInstanceConfigRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.GetInstanceConfigRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetInstanceConfigRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.GetInstanceConfigRequest";
                            };
    
                            return GetInstanceConfigRequest;
                        })();
    
                        v1.CreateInstanceConfigRequest = (function() {
    
                            /**
                             * Properties of a CreateInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstanceConfigRequest
                             * @property {string|null} [parent] CreateInstanceConfigRequest parent
                             * @property {string|null} [instanceConfigId] CreateInstanceConfigRequest instanceConfigId
                             * @property {google.spanner.admin.instance.v1.IInstanceConfig|null} [instanceConfig] CreateInstanceConfigRequest instanceConfig
                             * @property {boolean|null} [validateOnly] CreateInstanceConfigRequest validateOnly
                             */
    
                            /**
                             * Constructs a new CreateInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstanceConfigRequest.
                             * @implements ICreateInstanceConfigRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest=} [properties] Properties to set
                             */
                            function CreateInstanceConfigRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstanceConfigRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @instance
                             */
                            CreateInstanceConfigRequest.prototype.parent = "";
    
                            /**
                             * CreateInstanceConfigRequest instanceConfigId.
                             * @member {string} instanceConfigId
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @instance
                             */
                            CreateInstanceConfigRequest.prototype.instanceConfigId = "";
    
                            /**
                             * CreateInstanceConfigRequest instanceConfig.
                             * @member {google.spanner.admin.instance.v1.IInstanceConfig|null|undefined} instanceConfig
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @instance
                             */
                            CreateInstanceConfigRequest.prototype.instanceConfig = null;
    
                            /**
                             * CreateInstanceConfigRequest validateOnly.
                             * @member {boolean} validateOnly
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @instance
                             */
                            CreateInstanceConfigRequest.prototype.validateOnly = false;
    
                            /**
                             * Creates a new CreateInstanceConfigRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigRequest} CreateInstanceConfigRequest instance
                             */
                            CreateInstanceConfigRequest.create = function create(properties) {
                                return new CreateInstanceConfigRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstanceConfigRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceConfigRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest} message CreateInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceConfigRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.instanceConfigId != null && Object.hasOwnProperty.call(message, "instanceConfigId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceConfigId);
                                if (message.instanceConfig != null && Object.hasOwnProperty.call(message, "instanceConfig"))
                                    $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfig, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.validateOnly != null && Object.hasOwnProperty.call(message, "validateOnly"))
                                    writer.uint32(/* id 4, wireType 0 =*/32).bool(message.validateOnly);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstanceConfigRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceConfigRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigRequest} message CreateInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceConfigRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstanceConfigRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigRequest} CreateInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceConfigRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstanceConfigRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.instanceConfigId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.validateOnly = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstanceConfigRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigRequest} CreateInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceConfigRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstanceConfigRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstanceConfigRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                    if (!$util.isString(message.instanceConfigId))
                                        return "instanceConfigId: string expected";
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfig);
                                    if (error)
                                        return "instanceConfig." + error;
                                }
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    if (typeof message.validateOnly !== "boolean")
                                        return "validateOnly: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstanceConfigRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigRequest} CreateInstanceConfigRequest
                             */
                            CreateInstanceConfigRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstanceConfigRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstanceConfigRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.instanceConfigId != null)
                                    message.instanceConfigId = String(object.instanceConfigId);
                                if (object.instanceConfig != null) {
                                    if (typeof object.instanceConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceConfigRequest.instanceConfig: object expected");
                                    message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfig);
                                }
                                if (object.validateOnly != null)
                                    message.validateOnly = Boolean(object.validateOnly);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstanceConfigRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstanceConfigRequest} message CreateInstanceConfigRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstanceConfigRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.instanceConfigId = "";
                                    object.instanceConfig = null;
                                    object.validateOnly = false;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                    object.instanceConfigId = message.instanceConfigId;
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig"))
                                    object.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfig, options);
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    object.validateOnly = message.validateOnly;
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstanceConfigRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstanceConfigRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstanceConfigRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstanceConfigRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstanceConfigRequest";
                            };
    
                            return CreateInstanceConfigRequest;
                        })();
    
                        v1.UpdateInstanceConfigRequest = (function() {
    
                            /**
                             * Properties of an UpdateInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstanceConfigRequest
                             * @property {google.spanner.admin.instance.v1.IInstanceConfig|null} [instanceConfig] UpdateInstanceConfigRequest instanceConfig
                             * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateInstanceConfigRequest updateMask
                             * @property {boolean|null} [validateOnly] UpdateInstanceConfigRequest validateOnly
                             */
    
                            /**
                             * Constructs a new UpdateInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstanceConfigRequest.
                             * @implements IUpdateInstanceConfigRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest=} [properties] Properties to set
                             */
                            function UpdateInstanceConfigRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstanceConfigRequest instanceConfig.
                             * @member {google.spanner.admin.instance.v1.IInstanceConfig|null|undefined} instanceConfig
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @instance
                             */
                            UpdateInstanceConfigRequest.prototype.instanceConfig = null;
    
                            /**
                             * UpdateInstanceConfigRequest updateMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @instance
                             */
                            UpdateInstanceConfigRequest.prototype.updateMask = null;
    
                            /**
                             * UpdateInstanceConfigRequest validateOnly.
                             * @member {boolean} validateOnly
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @instance
                             */
                            UpdateInstanceConfigRequest.prototype.validateOnly = false;
    
                            /**
                             * Creates a new UpdateInstanceConfigRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigRequest} UpdateInstanceConfigRequest instance
                             */
                            UpdateInstanceConfigRequest.create = function create(properties) {
                                return new UpdateInstanceConfigRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceConfigRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceConfigRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest} message UpdateInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceConfigRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instanceConfig != null && Object.hasOwnProperty.call(message, "instanceConfig"))
                                    $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfig, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                                    $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.validateOnly != null && Object.hasOwnProperty.call(message, "validateOnly"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).bool(message.validateOnly);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceConfigRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceConfigRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigRequest} message UpdateInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceConfigRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstanceConfigRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigRequest} UpdateInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceConfigRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstanceConfigRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.validateOnly = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstanceConfigRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigRequest} UpdateInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceConfigRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstanceConfigRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstanceConfigRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfig);
                                    if (error)
                                        return "instanceConfig." + error;
                                }
                                if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                                    if (error)
                                        return "updateMask." + error;
                                }
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    if (typeof message.validateOnly !== "boolean")
                                        return "validateOnly: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstanceConfigRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigRequest} UpdateInstanceConfigRequest
                             */
                            UpdateInstanceConfigRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstanceConfigRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstanceConfigRequest();
                                if (object.instanceConfig != null) {
                                    if (typeof object.instanceConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceConfigRequest.instanceConfig: object expected");
                                    message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfig);
                                }
                                if (object.updateMask != null) {
                                    if (typeof object.updateMask !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceConfigRequest.updateMask: object expected");
                                    message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                                }
                                if (object.validateOnly != null)
                                    message.validateOnly = Boolean(object.validateOnly);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstanceConfigRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstanceConfigRequest} message UpdateInstanceConfigRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstanceConfigRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instanceConfig = null;
                                    object.updateMask = null;
                                    object.validateOnly = false;
                                }
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig"))
                                    object.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfig, options);
                                if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                                    object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    object.validateOnly = message.validateOnly;
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstanceConfigRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstanceConfigRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstanceConfigRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstanceConfigRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstanceConfigRequest";
                            };
    
                            return UpdateInstanceConfigRequest;
                        })();
    
                        v1.DeleteInstanceConfigRequest = (function() {
    
                            /**
                             * Properties of a DeleteInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IDeleteInstanceConfigRequest
                             * @property {string|null} [name] DeleteInstanceConfigRequest name
                             * @property {string|null} [etag] DeleteInstanceConfigRequest etag
                             * @property {boolean|null} [validateOnly] DeleteInstanceConfigRequest validateOnly
                             */
    
                            /**
                             * Constructs a new DeleteInstanceConfigRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a DeleteInstanceConfigRequest.
                             * @implements IDeleteInstanceConfigRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest=} [properties] Properties to set
                             */
                            function DeleteInstanceConfigRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DeleteInstanceConfigRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @instance
                             */
                            DeleteInstanceConfigRequest.prototype.name = "";
    
                            /**
                             * DeleteInstanceConfigRequest etag.
                             * @member {string} etag
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @instance
                             */
                            DeleteInstanceConfigRequest.prototype.etag = "";
    
                            /**
                             * DeleteInstanceConfigRequest validateOnly.
                             * @member {boolean} validateOnly
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @instance
                             */
                            DeleteInstanceConfigRequest.prototype.validateOnly = false;
    
                            /**
                             * Creates a new DeleteInstanceConfigRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceConfigRequest} DeleteInstanceConfigRequest instance
                             */
                            DeleteInstanceConfigRequest.create = function create(properties) {
                                return new DeleteInstanceConfigRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DeleteInstanceConfigRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstanceConfigRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest} message DeleteInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstanceConfigRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.etag != null && Object.hasOwnProperty.call(message, "etag"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.etag);
                                if (message.validateOnly != null && Object.hasOwnProperty.call(message, "validateOnly"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).bool(message.validateOnly);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DeleteInstanceConfigRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstanceConfigRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceConfigRequest} message DeleteInstanceConfigRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstanceConfigRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DeleteInstanceConfigRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceConfigRequest} DeleteInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstanceConfigRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.DeleteInstanceConfigRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.etag = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.validateOnly = reader.bool();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DeleteInstanceConfigRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceConfigRequest} DeleteInstanceConfigRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstanceConfigRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DeleteInstanceConfigRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DeleteInstanceConfigRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    if (!$util.isString(message.etag))
                                        return "etag: string expected";
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    if (typeof message.validateOnly !== "boolean")
                                        return "validateOnly: boolean expected";
                                return null;
                            };
    
                            /**
                             * Creates a DeleteInstanceConfigRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceConfigRequest} DeleteInstanceConfigRequest
                             */
                            DeleteInstanceConfigRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.DeleteInstanceConfigRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.DeleteInstanceConfigRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.etag != null)
                                    message.etag = String(object.etag);
                                if (object.validateOnly != null)
                                    message.validateOnly = Boolean(object.validateOnly);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DeleteInstanceConfigRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.DeleteInstanceConfigRequest} message DeleteInstanceConfigRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DeleteInstanceConfigRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.etag = "";
                                    object.validateOnly = false;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    object.etag = message.etag;
                                if (message.validateOnly != null && message.hasOwnProperty("validateOnly"))
                                    object.validateOnly = message.validateOnly;
                                return object;
                            };
    
                            /**
                             * Converts this DeleteInstanceConfigRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DeleteInstanceConfigRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DeleteInstanceConfigRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceConfigRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DeleteInstanceConfigRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.DeleteInstanceConfigRequest";
                            };
    
                            return DeleteInstanceConfigRequest;
                        })();
    
                        v1.ListInstanceConfigOperationsRequest = (function() {
    
                            /**
                             * Properties of a ListInstanceConfigOperationsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstanceConfigOperationsRequest
                             * @property {string|null} [parent] ListInstanceConfigOperationsRequest parent
                             * @property {string|null} [filter] ListInstanceConfigOperationsRequest filter
                             * @property {number|null} [pageSize] ListInstanceConfigOperationsRequest pageSize
                             * @property {string|null} [pageToken] ListInstanceConfigOperationsRequest pageToken
                             */
    
                            /**
                             * Constructs a new ListInstanceConfigOperationsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstanceConfigOperationsRequest.
                             * @implements IListInstanceConfigOperationsRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest=} [properties] Properties to set
                             */
                            function ListInstanceConfigOperationsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstanceConfigOperationsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @instance
                             */
                            ListInstanceConfigOperationsRequest.prototype.parent = "";
    
                            /**
                             * ListInstanceConfigOperationsRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @instance
                             */
                            ListInstanceConfigOperationsRequest.prototype.filter = "";
    
                            /**
                             * ListInstanceConfigOperationsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @instance
                             */
                            ListInstanceConfigOperationsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListInstanceConfigOperationsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @instance
                             */
                            ListInstanceConfigOperationsRequest.prototype.pageToken = "";
    
                            /**
                             * Creates a new ListInstanceConfigOperationsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest} ListInstanceConfigOperationsRequest instance
                             */
                            ListInstanceConfigOperationsRequest.create = function create(properties) {
                                return new ListInstanceConfigOperationsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigOperationsRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest} message ListInstanceConfigOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigOperationsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigOperationsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsRequest} message ListInstanceConfigOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstanceConfigOperationsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest} ListInstanceConfigOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigOperationsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstanceConfigOperationsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest} ListInstanceConfigOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstanceConfigOperationsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstanceConfigOperationsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListInstanceConfigOperationsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest} ListInstanceConfigOperationsRequest
                             */
                            ListInstanceConfigOperationsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstanceConfigOperationsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest} message ListInstanceConfigOperationsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstanceConfigOperationsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.filter = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListInstanceConfigOperationsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstanceConfigOperationsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstanceConfigOperationsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstanceConfigOperationsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstanceConfigOperationsRequest";
                            };
    
                            return ListInstanceConfigOperationsRequest;
                        })();
    
                        v1.ListInstanceConfigOperationsResponse = (function() {
    
                            /**
                             * Properties of a ListInstanceConfigOperationsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstanceConfigOperationsResponse
                             * @property {Array.<google.longrunning.IOperation>|null} [operations] ListInstanceConfigOperationsResponse operations
                             * @property {string|null} [nextPageToken] ListInstanceConfigOperationsResponse nextPageToken
                             */
    
                            /**
                             * Constructs a new ListInstanceConfigOperationsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstanceConfigOperationsResponse.
                             * @implements IListInstanceConfigOperationsResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsResponse=} [properties] Properties to set
                             */
                            function ListInstanceConfigOperationsResponse(properties) {
                                this.operations = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstanceConfigOperationsResponse operations.
                             * @member {Array.<google.longrunning.IOperation>} operations
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @instance
                             */
                            ListInstanceConfigOperationsResponse.prototype.operations = $util.emptyArray;
    
                            /**
                             * ListInstanceConfigOperationsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @instance
                             */
                            ListInstanceConfigOperationsResponse.prototype.nextPageToken = "";
    
                            /**
                             * Creates a new ListInstanceConfigOperationsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} ListInstanceConfigOperationsResponse instance
                             */
                            ListInstanceConfigOperationsResponse.create = function create(properties) {
                                return new ListInstanceConfigOperationsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigOperationsResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsResponse} message ListInstanceConfigOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigOperationsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.operations != null && message.operations.length)
                                    for (var i = 0; i < message.operations.length; ++i)
                                        $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstanceConfigOperationsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstanceConfigOperationsResponse} message ListInstanceConfigOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstanceConfigOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstanceConfigOperationsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} ListInstanceConfigOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigOperationsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.operations && message.operations.length))
                                                message.operations = [];
                                            message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstanceConfigOperationsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} ListInstanceConfigOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstanceConfigOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstanceConfigOperationsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstanceConfigOperationsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.operations != null && message.hasOwnProperty("operations")) {
                                    if (!Array.isArray(message.operations))
                                        return "operations: array expected";
                                    for (var i = 0; i < message.operations.length; ++i) {
                                        var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                                        if (error)
                                            return "operations." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a ListInstanceConfigOperationsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} ListInstanceConfigOperationsResponse
                             */
                            ListInstanceConfigOperationsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse();
                                if (object.operations) {
                                    if (!Array.isArray(object.operations))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse.operations: array expected");
                                    message.operations = [];
                                    for (var i = 0; i < object.operations.length; ++i) {
                                        if (typeof object.operations[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse.operations: object expected");
                                        message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstanceConfigOperationsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse} message ListInstanceConfigOperationsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstanceConfigOperationsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.operations = [];
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.operations && message.operations.length) {
                                    object.operations = [];
                                    for (var j = 0; j < message.operations.length; ++j)
                                        object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                return object;
                            };
    
                            /**
                             * Converts this ListInstanceConfigOperationsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstanceConfigOperationsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstanceConfigOperationsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstanceConfigOperationsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstanceConfigOperationsResponse";
                            };
    
                            return ListInstanceConfigOperationsResponse;
                        })();
    
                        v1.GetInstanceRequest = (function() {
    
                            /**
                             * Properties of a GetInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IGetInstanceRequest
                             * @property {string|null} [name] GetInstanceRequest name
                             * @property {google.protobuf.IFieldMask|null} [fieldMask] GetInstanceRequest fieldMask
                             */
    
                            /**
                             * Constructs a new GetInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a GetInstanceRequest.
                             * @implements IGetInstanceRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest=} [properties] Properties to set
                             */
                            function GetInstanceRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetInstanceRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @instance
                             */
                            GetInstanceRequest.prototype.name = "";
    
                            /**
                             * GetInstanceRequest fieldMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} fieldMask
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @instance
                             */
                            GetInstanceRequest.prototype.fieldMask = null;
    
                            /**
                             * Creates a new GetInstanceRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.GetInstanceRequest} GetInstanceRequest instance
                             */
                            GetInstanceRequest.create = function create(properties) {
                                return new GetInstanceRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetInstanceRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstanceRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest} message GetInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstanceRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.fieldMask != null && Object.hasOwnProperty.call(message, "fieldMask"))
                                    $root.google.protobuf.FieldMask.encode(message.fieldMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetInstanceRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstanceRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstanceRequest} message GetInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstanceRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetInstanceRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.GetInstanceRequest} GetInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstanceRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.GetInstanceRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.fieldMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetInstanceRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.GetInstanceRequest} GetInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstanceRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetInstanceRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetInstanceRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.fieldMask);
                                    if (error)
                                        return "fieldMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a GetInstanceRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.GetInstanceRequest} GetInstanceRequest
                             */
                            GetInstanceRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.GetInstanceRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.GetInstanceRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.fieldMask != null) {
                                    if (typeof object.fieldMask !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.GetInstanceRequest.fieldMask: object expected");
                                    message.fieldMask = $root.google.protobuf.FieldMask.fromObject(object.fieldMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetInstanceRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.GetInstanceRequest} message GetInstanceRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetInstanceRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.fieldMask = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask"))
                                    object.fieldMask = $root.google.protobuf.FieldMask.toObject(message.fieldMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this GetInstanceRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetInstanceRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetInstanceRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.GetInstanceRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetInstanceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.GetInstanceRequest";
                            };
    
                            return GetInstanceRequest;
                        })();
    
                        v1.CreateInstanceRequest = (function() {
    
                            /**
                             * Properties of a CreateInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstanceRequest
                             * @property {string|null} [parent] CreateInstanceRequest parent
                             * @property {string|null} [instanceId] CreateInstanceRequest instanceId
                             * @property {google.spanner.admin.instance.v1.IInstance|null} [instance] CreateInstanceRequest instance
                             */
    
                            /**
                             * Constructs a new CreateInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstanceRequest.
                             * @implements ICreateInstanceRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest=} [properties] Properties to set
                             */
                            function CreateInstanceRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstanceRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @instance
                             */
                            CreateInstanceRequest.prototype.parent = "";
    
                            /**
                             * CreateInstanceRequest instanceId.
                             * @member {string} instanceId
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @instance
                             */
                            CreateInstanceRequest.prototype.instanceId = "";
    
                            /**
                             * CreateInstanceRequest instance.
                             * @member {google.spanner.admin.instance.v1.IInstance|null|undefined} instance
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @instance
                             */
                            CreateInstanceRequest.prototype.instance = null;
    
                            /**
                             * Creates a new CreateInstanceRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceRequest} CreateInstanceRequest instance
                             */
                            CreateInstanceRequest.create = function create(properties) {
                                return new CreateInstanceRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstanceRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest} message CreateInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                                if (message.instance != null && Object.hasOwnProperty.call(message, "instance"))
                                    $root.google.spanner.admin.instance.v1.Instance.encode(message.instance, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstanceRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceRequest} message CreateInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstanceRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceRequest} CreateInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstanceRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.instanceId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.instance = $root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstanceRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceRequest} CreateInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstanceRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstanceRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                    if (!$util.isString(message.instanceId))
                                        return "instanceId: string expected";
                                if (message.instance != null && message.hasOwnProperty("instance")) {
                                    var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instance);
                                    if (error)
                                        return "instance." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstanceRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceRequest} CreateInstanceRequest
                             */
                            CreateInstanceRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstanceRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstanceRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.instanceId != null)
                                    message.instanceId = String(object.instanceId);
                                if (object.instance != null) {
                                    if (typeof object.instance !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceRequest.instance: object expected");
                                    message.instance = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instance);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstanceRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstanceRequest} message CreateInstanceRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstanceRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.instanceId = "";
                                    object.instance = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                    object.instanceId = message.instanceId;
                                if (message.instance != null && message.hasOwnProperty("instance"))
                                    object.instance = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instance, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstanceRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstanceRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstanceRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstanceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstanceRequest";
                            };
    
                            return CreateInstanceRequest;
                        })();
    
                        v1.ListInstancesRequest = (function() {
    
                            /**
                             * Properties of a ListInstancesRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancesRequest
                             * @property {string|null} [parent] ListInstancesRequest parent
                             * @property {number|null} [pageSize] ListInstancesRequest pageSize
                             * @property {string|null} [pageToken] ListInstancesRequest pageToken
                             * @property {string|null} [filter] ListInstancesRequest filter
                             * @property {google.protobuf.ITimestamp|null} [instanceDeadline] ListInstancesRequest instanceDeadline
                             */
    
                            /**
                             * Constructs a new ListInstancesRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancesRequest.
                             * @implements IListInstancesRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest=} [properties] Properties to set
                             */
                            function ListInstancesRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancesRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             */
                            ListInstancesRequest.prototype.parent = "";
    
                            /**
                             * ListInstancesRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             */
                            ListInstancesRequest.prototype.pageSize = 0;
    
                            /**
                             * ListInstancesRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             */
                            ListInstancesRequest.prototype.pageToken = "";
    
                            /**
                             * ListInstancesRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             */
                            ListInstancesRequest.prototype.filter = "";
    
                            /**
                             * ListInstancesRequest instanceDeadline.
                             * @member {google.protobuf.ITimestamp|null|undefined} instanceDeadline
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             */
                            ListInstancesRequest.prototype.instanceDeadline = null;
    
                            /**
                             * Creates a new ListInstancesRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancesRequest} ListInstancesRequest instance
                             */
                            ListInstancesRequest.create = function create(properties) {
                                return new ListInstancesRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancesRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancesRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest} message ListInstancesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancesRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.filter);
                                if (message.instanceDeadline != null && Object.hasOwnProperty.call(message, "instanceDeadline"))
                                    $root.google.protobuf.Timestamp.encode(message.instanceDeadline, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancesRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancesRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesRequest} message ListInstancesRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancesRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancesRequest} ListInstancesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancesRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancesRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.instanceDeadline = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancesRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancesRequest} ListInstancesRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancesRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancesRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancesRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.instanceDeadline != null && message.hasOwnProperty("instanceDeadline")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.instanceDeadline);
                                    if (error)
                                        return "instanceDeadline." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancesRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancesRequest} ListInstancesRequest
                             */
                            ListInstancesRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancesRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancesRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.instanceDeadline != null) {
                                    if (typeof object.instanceDeadline !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancesRequest.instanceDeadline: object expected");
                                    message.instanceDeadline = $root.google.protobuf.Timestamp.fromObject(object.instanceDeadline);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancesRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancesRequest} message ListInstancesRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancesRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                    object.filter = "";
                                    object.instanceDeadline = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.instanceDeadline != null && message.hasOwnProperty("instanceDeadline"))
                                    object.instanceDeadline = $root.google.protobuf.Timestamp.toObject(message.instanceDeadline, options);
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancesRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancesRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancesRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancesRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancesRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancesRequest";
                            };
    
                            return ListInstancesRequest;
                        })();
    
                        v1.ListInstancesResponse = (function() {
    
                            /**
                             * Properties of a ListInstancesResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancesResponse
                             * @property {Array.<google.spanner.admin.instance.v1.IInstance>|null} [instances] ListInstancesResponse instances
                             * @property {string|null} [nextPageToken] ListInstancesResponse nextPageToken
                             * @property {Array.<string>|null} [unreachable] ListInstancesResponse unreachable
                             */
    
                            /**
                             * Constructs a new ListInstancesResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancesResponse.
                             * @implements IListInstancesResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancesResponse=} [properties] Properties to set
                             */
                            function ListInstancesResponse(properties) {
                                this.instances = [];
                                this.unreachable = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancesResponse instances.
                             * @member {Array.<google.spanner.admin.instance.v1.IInstance>} instances
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @instance
                             */
                            ListInstancesResponse.prototype.instances = $util.emptyArray;
    
                            /**
                             * ListInstancesResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @instance
                             */
                            ListInstancesResponse.prototype.nextPageToken = "";
    
                            /**
                             * ListInstancesResponse unreachable.
                             * @member {Array.<string>} unreachable
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @instance
                             */
                            ListInstancesResponse.prototype.unreachable = $util.emptyArray;
    
                            /**
                             * Creates a new ListInstancesResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancesResponse} ListInstancesResponse instance
                             */
                            ListInstancesResponse.create = function create(properties) {
                                return new ListInstancesResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancesResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancesResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesResponse} message ListInstancesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancesResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instances != null && message.instances.length)
                                    for (var i = 0; i < message.instances.length; ++i)
                                        $root.google.spanner.admin.instance.v1.Instance.encode(message.instances[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                if (message.unreachable != null && message.unreachable.length)
                                    for (var i = 0; i < message.unreachable.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.unreachable[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancesResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancesResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancesResponse} message ListInstancesResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancesResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancesResponse} ListInstancesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancesResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancesResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.instances && message.instances.length))
                                                message.instances = [];
                                            message.instances.push($root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.unreachable && message.unreachable.length))
                                                message.unreachable = [];
                                            message.unreachable.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancesResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancesResponse} ListInstancesResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancesResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancesResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancesResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instances != null && message.hasOwnProperty("instances")) {
                                    if (!Array.isArray(message.instances))
                                        return "instances: array expected";
                                    for (var i = 0; i < message.instances.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instances[i]);
                                        if (error)
                                            return "instances." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                if (message.unreachable != null && message.hasOwnProperty("unreachable")) {
                                    if (!Array.isArray(message.unreachable))
                                        return "unreachable: array expected";
                                    for (var i = 0; i < message.unreachable.length; ++i)
                                        if (!$util.isString(message.unreachable[i]))
                                            return "unreachable: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancesResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancesResponse} ListInstancesResponse
                             */
                            ListInstancesResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancesResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancesResponse();
                                if (object.instances) {
                                    if (!Array.isArray(object.instances))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancesResponse.instances: array expected");
                                    message.instances = [];
                                    for (var i = 0; i < object.instances.length; ++i) {
                                        if (typeof object.instances[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.ListInstancesResponse.instances: object expected");
                                        message.instances[i] = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instances[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                if (object.unreachable) {
                                    if (!Array.isArray(object.unreachable))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancesResponse.unreachable: array expected");
                                    message.unreachable = [];
                                    for (var i = 0; i < object.unreachable.length; ++i)
                                        message.unreachable[i] = String(object.unreachable[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancesResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancesResponse} message ListInstancesResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancesResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.instances = [];
                                    object.unreachable = [];
                                }
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.instances && message.instances.length) {
                                    object.instances = [];
                                    for (var j = 0; j < message.instances.length; ++j)
                                        object.instances[j] = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instances[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                if (message.unreachable && message.unreachable.length) {
                                    object.unreachable = [];
                                    for (var j = 0; j < message.unreachable.length; ++j)
                                        object.unreachable[j] = message.unreachable[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancesResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancesResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancesResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancesResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancesResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancesResponse";
                            };
    
                            return ListInstancesResponse;
                        })();
    
                        v1.UpdateInstanceRequest = (function() {
    
                            /**
                             * Properties of an UpdateInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstanceRequest
                             * @property {google.spanner.admin.instance.v1.IInstance|null} [instance] UpdateInstanceRequest instance
                             * @property {google.protobuf.IFieldMask|null} [fieldMask] UpdateInstanceRequest fieldMask
                             */
    
                            /**
                             * Constructs a new UpdateInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstanceRequest.
                             * @implements IUpdateInstanceRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest=} [properties] Properties to set
                             */
                            function UpdateInstanceRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstanceRequest instance.
                             * @member {google.spanner.admin.instance.v1.IInstance|null|undefined} instance
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @instance
                             */
                            UpdateInstanceRequest.prototype.instance = null;
    
                            /**
                             * UpdateInstanceRequest fieldMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} fieldMask
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @instance
                             */
                            UpdateInstanceRequest.prototype.fieldMask = null;
    
                            /**
                             * Creates a new UpdateInstanceRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceRequest} UpdateInstanceRequest instance
                             */
                            UpdateInstanceRequest.create = function create(properties) {
                                return new UpdateInstanceRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest} message UpdateInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instance != null && Object.hasOwnProperty.call(message, "instance"))
                                    $root.google.spanner.admin.instance.v1.Instance.encode(message.instance, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.fieldMask != null && Object.hasOwnProperty.call(message, "fieldMask"))
                                    $root.google.protobuf.FieldMask.encode(message.fieldMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceRequest} message UpdateInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstanceRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceRequest} UpdateInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstanceRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instance = $root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.fieldMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstanceRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceRequest} UpdateInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstanceRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstanceRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instance != null && message.hasOwnProperty("instance")) {
                                    var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instance);
                                    if (error)
                                        return "instance." + error;
                                }
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.fieldMask);
                                    if (error)
                                        return "fieldMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstanceRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceRequest} UpdateInstanceRequest
                             */
                            UpdateInstanceRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstanceRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstanceRequest();
                                if (object.instance != null) {
                                    if (typeof object.instance !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceRequest.instance: object expected");
                                    message.instance = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instance);
                                }
                                if (object.fieldMask != null) {
                                    if (typeof object.fieldMask !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceRequest.fieldMask: object expected");
                                    message.fieldMask = $root.google.protobuf.FieldMask.fromObject(object.fieldMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstanceRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstanceRequest} message UpdateInstanceRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstanceRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instance = null;
                                    object.fieldMask = null;
                                }
                                if (message.instance != null && message.hasOwnProperty("instance"))
                                    object.instance = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instance, options);
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask"))
                                    object.fieldMask = $root.google.protobuf.FieldMask.toObject(message.fieldMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstanceRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstanceRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstanceRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstanceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstanceRequest";
                            };
    
                            return UpdateInstanceRequest;
                        })();
    
                        v1.DeleteInstanceRequest = (function() {
    
                            /**
                             * Properties of a DeleteInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IDeleteInstanceRequest
                             * @property {string|null} [name] DeleteInstanceRequest name
                             */
    
                            /**
                             * Constructs a new DeleteInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a DeleteInstanceRequest.
                             * @implements IDeleteInstanceRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest=} [properties] Properties to set
                             */
                            function DeleteInstanceRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DeleteInstanceRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @instance
                             */
                            DeleteInstanceRequest.prototype.name = "";
    
                            /**
                             * Creates a new DeleteInstanceRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceRequest} DeleteInstanceRequest instance
                             */
                            DeleteInstanceRequest.create = function create(properties) {
                                return new DeleteInstanceRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DeleteInstanceRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstanceRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest} message DeleteInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstanceRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DeleteInstanceRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstanceRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstanceRequest} message DeleteInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstanceRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DeleteInstanceRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceRequest} DeleteInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstanceRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.DeleteInstanceRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DeleteInstanceRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceRequest} DeleteInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstanceRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DeleteInstanceRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DeleteInstanceRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DeleteInstanceRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.DeleteInstanceRequest} DeleteInstanceRequest
                             */
                            DeleteInstanceRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.DeleteInstanceRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.DeleteInstanceRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DeleteInstanceRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.DeleteInstanceRequest} message DeleteInstanceRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DeleteInstanceRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this DeleteInstanceRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DeleteInstanceRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DeleteInstanceRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.DeleteInstanceRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DeleteInstanceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.DeleteInstanceRequest";
                            };
    
                            return DeleteInstanceRequest;
                        })();
    
                        v1.CreateInstanceMetadata = (function() {
    
                            /**
                             * Properties of a CreateInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstanceMetadata
                             * @property {google.spanner.admin.instance.v1.IInstance|null} [instance] CreateInstanceMetadata instance
                             * @property {google.protobuf.ITimestamp|null} [startTime] CreateInstanceMetadata startTime
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] CreateInstanceMetadata cancelTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] CreateInstanceMetadata endTime
                             * @property {google.spanner.admin.instance.v1.FulfillmentPeriod|null} [expectedFulfillmentPeriod] CreateInstanceMetadata expectedFulfillmentPeriod
                             */
    
                            /**
                             * Constructs a new CreateInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstanceMetadata.
                             * @implements ICreateInstanceMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceMetadata=} [properties] Properties to set
                             */
                            function CreateInstanceMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstanceMetadata instance.
                             * @member {google.spanner.admin.instance.v1.IInstance|null|undefined} instance
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             */
                            CreateInstanceMetadata.prototype.instance = null;
    
                            /**
                             * CreateInstanceMetadata startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             */
                            CreateInstanceMetadata.prototype.startTime = null;
    
                            /**
                             * CreateInstanceMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             */
                            CreateInstanceMetadata.prototype.cancelTime = null;
    
                            /**
                             * CreateInstanceMetadata endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             */
                            CreateInstanceMetadata.prototype.endTime = null;
    
                            /**
                             * CreateInstanceMetadata expectedFulfillmentPeriod.
                             * @member {google.spanner.admin.instance.v1.FulfillmentPeriod} expectedFulfillmentPeriod
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             */
                            CreateInstanceMetadata.prototype.expectedFulfillmentPeriod = 0;
    
                            /**
                             * Creates a new CreateInstanceMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceMetadata} CreateInstanceMetadata instance
                             */
                            CreateInstanceMetadata.create = function create(properties) {
                                return new CreateInstanceMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstanceMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceMetadata} message CreateInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instance != null && Object.hasOwnProperty.call(message, "instance"))
                                    $root.google.spanner.admin.instance.v1.Instance.encode(message.instance, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.expectedFulfillmentPeriod != null && Object.hasOwnProperty.call(message, "expectedFulfillmentPeriod"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.expectedFulfillmentPeriod);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstanceMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceMetadata} message CreateInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstanceMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceMetadata} CreateInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstanceMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instance = $root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.expectedFulfillmentPeriod = reader.int32();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstanceMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceMetadata} CreateInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstanceMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstanceMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instance != null && message.hasOwnProperty("instance")) {
                                    var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instance);
                                    if (error)
                                        return "instance." + error;
                                }
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                if (message.expectedFulfillmentPeriod != null && message.hasOwnProperty("expectedFulfillmentPeriod"))
                                    switch (message.expectedFulfillmentPeriod) {
                                    default:
                                        return "expectedFulfillmentPeriod: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstanceMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceMetadata} CreateInstanceMetadata
                             */
                            CreateInstanceMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstanceMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstanceMetadata();
                                if (object.instance != null) {
                                    if (typeof object.instance !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceMetadata.instance: object expected");
                                    message.instance = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instance);
                                }
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceMetadata.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceMetadata.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                switch (object.expectedFulfillmentPeriod) {
                                default:
                                    if (typeof object.expectedFulfillmentPeriod === "number") {
                                        message.expectedFulfillmentPeriod = object.expectedFulfillmentPeriod;
                                        break;
                                    }
                                    break;
                                case "FULFILLMENT_PERIOD_UNSPECIFIED":
                                case 0:
                                    message.expectedFulfillmentPeriod = 0;
                                    break;
                                case "FULFILLMENT_PERIOD_NORMAL":
                                case 1:
                                    message.expectedFulfillmentPeriod = 1;
                                    break;
                                case "FULFILLMENT_PERIOD_EXTENDED":
                                case 2:
                                    message.expectedFulfillmentPeriod = 2;
                                    break;
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstanceMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstanceMetadata} message CreateInstanceMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstanceMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instance = null;
                                    object.startTime = null;
                                    object.cancelTime = null;
                                    object.endTime = null;
                                    object.expectedFulfillmentPeriod = options.enums === String ? "FULFILLMENT_PERIOD_UNSPECIFIED" : 0;
                                }
                                if (message.instance != null && message.hasOwnProperty("instance"))
                                    object.instance = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instance, options);
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                if (message.expectedFulfillmentPeriod != null && message.hasOwnProperty("expectedFulfillmentPeriod"))
                                    object.expectedFulfillmentPeriod = options.enums === String ? $root.google.spanner.admin.instance.v1.FulfillmentPeriod[message.expectedFulfillmentPeriod] === undefined ? message.expectedFulfillmentPeriod : $root.google.spanner.admin.instance.v1.FulfillmentPeriod[message.expectedFulfillmentPeriod] : message.expectedFulfillmentPeriod;
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstanceMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstanceMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstanceMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstanceMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstanceMetadata";
                            };
    
                            return CreateInstanceMetadata;
                        })();
    
                        v1.UpdateInstanceMetadata = (function() {
    
                            /**
                             * Properties of an UpdateInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstanceMetadata
                             * @property {google.spanner.admin.instance.v1.IInstance|null} [instance] UpdateInstanceMetadata instance
                             * @property {google.protobuf.ITimestamp|null} [startTime] UpdateInstanceMetadata startTime
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] UpdateInstanceMetadata cancelTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] UpdateInstanceMetadata endTime
                             * @property {google.spanner.admin.instance.v1.FulfillmentPeriod|null} [expectedFulfillmentPeriod] UpdateInstanceMetadata expectedFulfillmentPeriod
                             */
    
                            /**
                             * Constructs a new UpdateInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstanceMetadata.
                             * @implements IUpdateInstanceMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceMetadata=} [properties] Properties to set
                             */
                            function UpdateInstanceMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstanceMetadata instance.
                             * @member {google.spanner.admin.instance.v1.IInstance|null|undefined} instance
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             */
                            UpdateInstanceMetadata.prototype.instance = null;
    
                            /**
                             * UpdateInstanceMetadata startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             */
                            UpdateInstanceMetadata.prototype.startTime = null;
    
                            /**
                             * UpdateInstanceMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             */
                            UpdateInstanceMetadata.prototype.cancelTime = null;
    
                            /**
                             * UpdateInstanceMetadata endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             */
                            UpdateInstanceMetadata.prototype.endTime = null;
    
                            /**
                             * UpdateInstanceMetadata expectedFulfillmentPeriod.
                             * @member {google.spanner.admin.instance.v1.FulfillmentPeriod} expectedFulfillmentPeriod
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             */
                            UpdateInstanceMetadata.prototype.expectedFulfillmentPeriod = 0;
    
                            /**
                             * Creates a new UpdateInstanceMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceMetadata} UpdateInstanceMetadata instance
                             */
                            UpdateInstanceMetadata.create = function create(properties) {
                                return new UpdateInstanceMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceMetadata} message UpdateInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instance != null && Object.hasOwnProperty.call(message, "instance"))
                                    $root.google.spanner.admin.instance.v1.Instance.encode(message.instance, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.expectedFulfillmentPeriod != null && Object.hasOwnProperty.call(message, "expectedFulfillmentPeriod"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.expectedFulfillmentPeriod);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceMetadata} message UpdateInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstanceMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceMetadata} UpdateInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstanceMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instance = $root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.expectedFulfillmentPeriod = reader.int32();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstanceMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceMetadata} UpdateInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstanceMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstanceMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instance != null && message.hasOwnProperty("instance")) {
                                    var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instance);
                                    if (error)
                                        return "instance." + error;
                                }
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                if (message.expectedFulfillmentPeriod != null && message.hasOwnProperty("expectedFulfillmentPeriod"))
                                    switch (message.expectedFulfillmentPeriod) {
                                    default:
                                        return "expectedFulfillmentPeriod: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstanceMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceMetadata} UpdateInstanceMetadata
                             */
                            UpdateInstanceMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstanceMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstanceMetadata();
                                if (object.instance != null) {
                                    if (typeof object.instance !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceMetadata.instance: object expected");
                                    message.instance = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instance);
                                }
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceMetadata.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceMetadata.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                switch (object.expectedFulfillmentPeriod) {
                                default:
                                    if (typeof object.expectedFulfillmentPeriod === "number") {
                                        message.expectedFulfillmentPeriod = object.expectedFulfillmentPeriod;
                                        break;
                                    }
                                    break;
                                case "FULFILLMENT_PERIOD_UNSPECIFIED":
                                case 0:
                                    message.expectedFulfillmentPeriod = 0;
                                    break;
                                case "FULFILLMENT_PERIOD_NORMAL":
                                case 1:
                                    message.expectedFulfillmentPeriod = 1;
                                    break;
                                case "FULFILLMENT_PERIOD_EXTENDED":
                                case 2:
                                    message.expectedFulfillmentPeriod = 2;
                                    break;
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstanceMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstanceMetadata} message UpdateInstanceMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstanceMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instance = null;
                                    object.startTime = null;
                                    object.cancelTime = null;
                                    object.endTime = null;
                                    object.expectedFulfillmentPeriod = options.enums === String ? "FULFILLMENT_PERIOD_UNSPECIFIED" : 0;
                                }
                                if (message.instance != null && message.hasOwnProperty("instance"))
                                    object.instance = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instance, options);
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                if (message.expectedFulfillmentPeriod != null && message.hasOwnProperty("expectedFulfillmentPeriod"))
                                    object.expectedFulfillmentPeriod = options.enums === String ? $root.google.spanner.admin.instance.v1.FulfillmentPeriod[message.expectedFulfillmentPeriod] === undefined ? message.expectedFulfillmentPeriod : $root.google.spanner.admin.instance.v1.FulfillmentPeriod[message.expectedFulfillmentPeriod] : message.expectedFulfillmentPeriod;
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstanceMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstanceMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstanceMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstanceMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstanceMetadata";
                            };
    
                            return UpdateInstanceMetadata;
                        })();
    
                        v1.FreeInstanceMetadata = (function() {
    
                            /**
                             * Properties of a FreeInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IFreeInstanceMetadata
                             * @property {google.protobuf.ITimestamp|null} [expireTime] FreeInstanceMetadata expireTime
                             * @property {google.protobuf.ITimestamp|null} [upgradeTime] FreeInstanceMetadata upgradeTime
                             * @property {google.spanner.admin.instance.v1.FreeInstanceMetadata.ExpireBehavior|null} [expireBehavior] FreeInstanceMetadata expireBehavior
                             */
    
                            /**
                             * Constructs a new FreeInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a FreeInstanceMetadata.
                             * @implements IFreeInstanceMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IFreeInstanceMetadata=} [properties] Properties to set
                             */
                            function FreeInstanceMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * FreeInstanceMetadata expireTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @instance
                             */
                            FreeInstanceMetadata.prototype.expireTime = null;
    
                            /**
                             * FreeInstanceMetadata upgradeTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} upgradeTime
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @instance
                             */
                            FreeInstanceMetadata.prototype.upgradeTime = null;
    
                            /**
                             * FreeInstanceMetadata expireBehavior.
                             * @member {google.spanner.admin.instance.v1.FreeInstanceMetadata.ExpireBehavior} expireBehavior
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @instance
                             */
                            FreeInstanceMetadata.prototype.expireBehavior = 0;
    
                            /**
                             * Creates a new FreeInstanceMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IFreeInstanceMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.FreeInstanceMetadata} FreeInstanceMetadata instance
                             */
                            FreeInstanceMetadata.create = function create(properties) {
                                return new FreeInstanceMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified FreeInstanceMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.FreeInstanceMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IFreeInstanceMetadata} message FreeInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            FreeInstanceMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                    $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.upgradeTime != null && Object.hasOwnProperty.call(message, "upgradeTime"))
                                    $root.google.protobuf.Timestamp.encode(message.upgradeTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.expireBehavior != null && Object.hasOwnProperty.call(message, "expireBehavior"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.expireBehavior);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified FreeInstanceMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.FreeInstanceMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IFreeInstanceMetadata} message FreeInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            FreeInstanceMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a FreeInstanceMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.FreeInstanceMetadata} FreeInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            FreeInstanceMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.FreeInstanceMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.upgradeTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.expireBehavior = reader.int32();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a FreeInstanceMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.FreeInstanceMetadata} FreeInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            FreeInstanceMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a FreeInstanceMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            FreeInstanceMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                    if (error)
                                        return "expireTime." + error;
                                }
                                if (message.upgradeTime != null && message.hasOwnProperty("upgradeTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.upgradeTime);
                                    if (error)
                                        return "upgradeTime." + error;
                                }
                                if (message.expireBehavior != null && message.hasOwnProperty("expireBehavior"))
                                    switch (message.expireBehavior) {
                                    default:
                                        return "expireBehavior: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                return null;
                            };
    
                            /**
                             * Creates a FreeInstanceMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.FreeInstanceMetadata} FreeInstanceMetadata
                             */
                            FreeInstanceMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.FreeInstanceMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.FreeInstanceMetadata();
                                if (object.expireTime != null) {
                                    if (typeof object.expireTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.FreeInstanceMetadata.expireTime: object expected");
                                    message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                                }
                                if (object.upgradeTime != null) {
                                    if (typeof object.upgradeTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.FreeInstanceMetadata.upgradeTime: object expected");
                                    message.upgradeTime = $root.google.protobuf.Timestamp.fromObject(object.upgradeTime);
                                }
                                switch (object.expireBehavior) {
                                default:
                                    if (typeof object.expireBehavior === "number") {
                                        message.expireBehavior = object.expireBehavior;
                                        break;
                                    }
                                    break;
                                case "EXPIRE_BEHAVIOR_UNSPECIFIED":
                                case 0:
                                    message.expireBehavior = 0;
                                    break;
                                case "FREE_TO_PROVISIONED":
                                case 1:
                                    message.expireBehavior = 1;
                                    break;
                                case "REMOVE_AFTER_GRACE_PERIOD":
                                case 2:
                                    message.expireBehavior = 2;
                                    break;
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a FreeInstanceMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.FreeInstanceMetadata} message FreeInstanceMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            FreeInstanceMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.expireTime = null;
                                    object.upgradeTime = null;
                                    object.expireBehavior = options.enums === String ? "EXPIRE_BEHAVIOR_UNSPECIFIED" : 0;
                                }
                                if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                    object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                                if (message.upgradeTime != null && message.hasOwnProperty("upgradeTime"))
                                    object.upgradeTime = $root.google.protobuf.Timestamp.toObject(message.upgradeTime, options);
                                if (message.expireBehavior != null && message.hasOwnProperty("expireBehavior"))
                                    object.expireBehavior = options.enums === String ? $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.ExpireBehavior[message.expireBehavior] === undefined ? message.expireBehavior : $root.google.spanner.admin.instance.v1.FreeInstanceMetadata.ExpireBehavior[message.expireBehavior] : message.expireBehavior;
                                return object;
                            };
    
                            /**
                             * Converts this FreeInstanceMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            FreeInstanceMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for FreeInstanceMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.FreeInstanceMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            FreeInstanceMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.FreeInstanceMetadata";
                            };
    
                            /**
                             * ExpireBehavior enum.
                             * @name google.spanner.admin.instance.v1.FreeInstanceMetadata.ExpireBehavior
                             * @enum {number}
                             * @property {number} EXPIRE_BEHAVIOR_UNSPECIFIED=0 EXPIRE_BEHAVIOR_UNSPECIFIED value
                             * @property {number} FREE_TO_PROVISIONED=1 FREE_TO_PROVISIONED value
                             * @property {number} REMOVE_AFTER_GRACE_PERIOD=2 REMOVE_AFTER_GRACE_PERIOD value
                             */
                            FreeInstanceMetadata.ExpireBehavior = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "EXPIRE_BEHAVIOR_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "FREE_TO_PROVISIONED"] = 1;
                                values[valuesById[2] = "REMOVE_AFTER_GRACE_PERIOD"] = 2;
                                return values;
                            })();
    
                            return FreeInstanceMetadata;
                        })();
    
                        v1.CreateInstanceConfigMetadata = (function() {
    
                            /**
                             * Properties of a CreateInstanceConfigMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstanceConfigMetadata
                             * @property {google.spanner.admin.instance.v1.IInstanceConfig|null} [instanceConfig] CreateInstanceConfigMetadata instanceConfig
                             * @property {google.spanner.admin.instance.v1.IOperationProgress|null} [progress] CreateInstanceConfigMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] CreateInstanceConfigMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new CreateInstanceConfigMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstanceConfigMetadata.
                             * @implements ICreateInstanceConfigMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigMetadata=} [properties] Properties to set
                             */
                            function CreateInstanceConfigMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstanceConfigMetadata instanceConfig.
                             * @member {google.spanner.admin.instance.v1.IInstanceConfig|null|undefined} instanceConfig
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @instance
                             */
                            CreateInstanceConfigMetadata.prototype.instanceConfig = null;
    
                            /**
                             * CreateInstanceConfigMetadata progress.
                             * @member {google.spanner.admin.instance.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @instance
                             */
                            CreateInstanceConfigMetadata.prototype.progress = null;
    
                            /**
                             * CreateInstanceConfigMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @instance
                             */
                            CreateInstanceConfigMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new CreateInstanceConfigMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigMetadata} CreateInstanceConfigMetadata instance
                             */
                            CreateInstanceConfigMetadata.create = function create(properties) {
                                return new CreateInstanceConfigMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstanceConfigMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceConfigMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigMetadata} message CreateInstanceConfigMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceConfigMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instanceConfig != null && Object.hasOwnProperty.call(message, "instanceConfig"))
                                    $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfig, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.instance.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstanceConfigMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstanceConfigMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstanceConfigMetadata} message CreateInstanceConfigMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstanceConfigMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstanceConfigMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigMetadata} CreateInstanceConfigMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceConfigMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstanceConfigMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstanceConfigMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigMetadata} CreateInstanceConfigMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstanceConfigMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstanceConfigMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstanceConfigMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfig);
                                    if (error)
                                        return "instanceConfig." + error;
                                }
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.instance.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstanceConfigMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstanceConfigMetadata} CreateInstanceConfigMetadata
                             */
                            CreateInstanceConfigMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstanceConfigMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstanceConfigMetadata();
                                if (object.instanceConfig != null) {
                                    if (typeof object.instanceConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceConfigMetadata.instanceConfig: object expected");
                                    message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfig);
                                }
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceConfigMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstanceConfigMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstanceConfigMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstanceConfigMetadata} message CreateInstanceConfigMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstanceConfigMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instanceConfig = null;
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig"))
                                    object.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfig, options);
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.instance.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstanceConfigMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstanceConfigMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstanceConfigMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstanceConfigMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstanceConfigMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstanceConfigMetadata";
                            };
    
                            return CreateInstanceConfigMetadata;
                        })();
    
                        v1.UpdateInstanceConfigMetadata = (function() {
    
                            /**
                             * Properties of an UpdateInstanceConfigMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstanceConfigMetadata
                             * @property {google.spanner.admin.instance.v1.IInstanceConfig|null} [instanceConfig] UpdateInstanceConfigMetadata instanceConfig
                             * @property {google.spanner.admin.instance.v1.IOperationProgress|null} [progress] UpdateInstanceConfigMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] UpdateInstanceConfigMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new UpdateInstanceConfigMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstanceConfigMetadata.
                             * @implements IUpdateInstanceConfigMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigMetadata=} [properties] Properties to set
                             */
                            function UpdateInstanceConfigMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstanceConfigMetadata instanceConfig.
                             * @member {google.spanner.admin.instance.v1.IInstanceConfig|null|undefined} instanceConfig
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @instance
                             */
                            UpdateInstanceConfigMetadata.prototype.instanceConfig = null;
    
                            /**
                             * UpdateInstanceConfigMetadata progress.
                             * @member {google.spanner.admin.instance.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @instance
                             */
                            UpdateInstanceConfigMetadata.prototype.progress = null;
    
                            /**
                             * UpdateInstanceConfigMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @instance
                             */
                            UpdateInstanceConfigMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new UpdateInstanceConfigMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata} UpdateInstanceConfigMetadata instance
                             */
                            UpdateInstanceConfigMetadata.create = function create(properties) {
                                return new UpdateInstanceConfigMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceConfigMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigMetadata} message UpdateInstanceConfigMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceConfigMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instanceConfig != null && Object.hasOwnProperty.call(message, "instanceConfig"))
                                    $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfig, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.instance.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstanceConfigMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstanceConfigMetadata} message UpdateInstanceConfigMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstanceConfigMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstanceConfigMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata} UpdateInstanceConfigMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceConfigMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstanceConfigMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata} UpdateInstanceConfigMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstanceConfigMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstanceConfigMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstanceConfigMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfig);
                                    if (error)
                                        return "instanceConfig." + error;
                                }
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.instance.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstanceConfigMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata} UpdateInstanceConfigMetadata
                             */
                            UpdateInstanceConfigMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata();
                                if (object.instanceConfig != null) {
                                    if (typeof object.instanceConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.instanceConfig: object expected");
                                    message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfig);
                                }
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstanceConfigMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata} message UpdateInstanceConfigMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstanceConfigMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instanceConfig = null;
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig"))
                                    object.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfig, options);
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.instance.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstanceConfigMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstanceConfigMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstanceConfigMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstanceConfigMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata";
                            };
    
                            return UpdateInstanceConfigMetadata;
                        })();
    
                        v1.InstancePartition = (function() {
    
                            /**
                             * Properties of an InstancePartition.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IInstancePartition
                             * @property {string|null} [name] InstancePartition name
                             * @property {string|null} [config] InstancePartition config
                             * @property {string|null} [displayName] InstancePartition displayName
                             * @property {number|null} [nodeCount] InstancePartition nodeCount
                             * @property {number|null} [processingUnits] InstancePartition processingUnits
                             * @property {google.spanner.admin.instance.v1.IAutoscalingConfig|null} [autoscalingConfig] InstancePartition autoscalingConfig
                             * @property {google.spanner.admin.instance.v1.InstancePartition.State|null} [state] InstancePartition state
                             * @property {google.protobuf.ITimestamp|null} [createTime] InstancePartition createTime
                             * @property {google.protobuf.ITimestamp|null} [updateTime] InstancePartition updateTime
                             * @property {Array.<string>|null} [referencingDatabases] InstancePartition referencingDatabases
                             * @property {Array.<string>|null} [referencingBackups] InstancePartition referencingBackups
                             * @property {string|null} [etag] InstancePartition etag
                             */
    
                            /**
                             * Constructs a new InstancePartition.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an InstancePartition.
                             * @implements IInstancePartition
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IInstancePartition=} [properties] Properties to set
                             */
                            function InstancePartition(properties) {
                                this.referencingDatabases = [];
                                this.referencingBackups = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * InstancePartition name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.name = "";
    
                            /**
                             * InstancePartition config.
                             * @member {string} config
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.config = "";
    
                            /**
                             * InstancePartition displayName.
                             * @member {string} displayName
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.displayName = "";
    
                            /**
                             * InstancePartition nodeCount.
                             * @member {number|null|undefined} nodeCount
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.nodeCount = null;
    
                            /**
                             * InstancePartition processingUnits.
                             * @member {number|null|undefined} processingUnits
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.processingUnits = null;
    
                            /**
                             * InstancePartition autoscalingConfig.
                             * @member {google.spanner.admin.instance.v1.IAutoscalingConfig|null|undefined} autoscalingConfig
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.autoscalingConfig = null;
    
                            /**
                             * InstancePartition state.
                             * @member {google.spanner.admin.instance.v1.InstancePartition.State} state
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.state = 0;
    
                            /**
                             * InstancePartition createTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} createTime
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.createTime = null;
    
                            /**
                             * InstancePartition updateTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.updateTime = null;
    
                            /**
                             * InstancePartition referencingDatabases.
                             * @member {Array.<string>} referencingDatabases
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.referencingDatabases = $util.emptyArray;
    
                            /**
                             * InstancePartition referencingBackups.
                             * @member {Array.<string>} referencingBackups
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.referencingBackups = $util.emptyArray;
    
                            /**
                             * InstancePartition etag.
                             * @member {string} etag
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            InstancePartition.prototype.etag = "";
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            /**
                             * InstancePartition computeCapacity.
                             * @member {"nodeCount"|"processingUnits"|undefined} computeCapacity
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             */
                            Object.defineProperty(InstancePartition.prototype, "computeCapacity", {
                                get: $util.oneOfGetter($oneOfFields = ["nodeCount", "processingUnits"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new InstancePartition instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstancePartition=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.InstancePartition} InstancePartition instance
                             */
                            InstancePartition.create = function create(properties) {
                                return new InstancePartition(properties);
                            };
    
                            /**
                             * Encodes the specified InstancePartition message. Does not implicitly {@link google.spanner.admin.instance.v1.InstancePartition.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstancePartition} message InstancePartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InstancePartition.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.config != null && Object.hasOwnProperty.call(message, "config"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.config);
                                if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.displayName);
                                if (message.nodeCount != null && Object.hasOwnProperty.call(message, "nodeCount"))
                                    writer.uint32(/* id 5, wireType 0 =*/40).int32(message.nodeCount);
                                if (message.processingUnits != null && Object.hasOwnProperty.call(message, "processingUnits"))
                                    writer.uint32(/* id 6, wireType 0 =*/48).int32(message.processingUnits);
                                if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                                    writer.uint32(/* id 7, wireType 0 =*/56).int32(message.state);
                                if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                                    $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                                if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                                    $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                                if (message.referencingDatabases != null && message.referencingDatabases.length)
                                    for (var i = 0; i < message.referencingDatabases.length; ++i)
                                        writer.uint32(/* id 10, wireType 2 =*/82).string(message.referencingDatabases[i]);
                                if (message.referencingBackups != null && message.referencingBackups.length)
                                    for (var i = 0; i < message.referencingBackups.length; ++i)
                                        writer.uint32(/* id 11, wireType 2 =*/90).string(message.referencingBackups[i]);
                                if (message.etag != null && Object.hasOwnProperty.call(message, "etag"))
                                    writer.uint32(/* id 12, wireType 2 =*/98).string(message.etag);
                                if (message.autoscalingConfig != null && Object.hasOwnProperty.call(message, "autoscalingConfig"))
                                    $root.google.spanner.admin.instance.v1.AutoscalingConfig.encode(message.autoscalingConfig, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified InstancePartition message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.InstancePartition.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {google.spanner.admin.instance.v1.IInstancePartition} message InstancePartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InstancePartition.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an InstancePartition message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.InstancePartition} InstancePartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InstancePartition.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.InstancePartition();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.config = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.displayName = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.nodeCount = reader.int32();
                                            break;
                                        }
                                    case 6: {
                                            message.processingUnits = reader.int32();
                                            break;
                                        }
                                    case 13: {
                                            message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 7: {
                                            message.state = reader.int32();
                                            break;
                                        }
                                    case 8: {
                                            message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 9: {
                                            message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 10: {
                                            if (!(message.referencingDatabases && message.referencingDatabases.length))
                                                message.referencingDatabases = [];
                                            message.referencingDatabases.push(reader.string());
                                            break;
                                        }
                                    case 11: {
                                            if (!(message.referencingBackups && message.referencingBackups.length))
                                                message.referencingBackups = [];
                                            message.referencingBackups.push(reader.string());
                                            break;
                                        }
                                    case 12: {
                                            message.etag = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an InstancePartition message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.InstancePartition} InstancePartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InstancePartition.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an InstancePartition message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            InstancePartition.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.config != null && message.hasOwnProperty("config"))
                                    if (!$util.isString(message.config))
                                        return "config: string expected";
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    if (!$util.isString(message.displayName))
                                        return "displayName: string expected";
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                    properties.computeCapacity = 1;
                                    if (!$util.isInteger(message.nodeCount))
                                        return "nodeCount: integer expected";
                                }
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                    if (properties.computeCapacity === 1)
                                        return "computeCapacity: multiple values";
                                    properties.computeCapacity = 1;
                                    if (!$util.isInteger(message.processingUnits))
                                        return "processingUnits: integer expected";
                                }
                                if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.verify(message.autoscalingConfig);
                                    if (error)
                                        return "autoscalingConfig." + error;
                                }
                                if (message.state != null && message.hasOwnProperty("state"))
                                    switch (message.state) {
                                    default:
                                        return "state: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                        break;
                                    }
                                if (message.createTime != null && message.hasOwnProperty("createTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                                    if (error)
                                        return "createTime." + error;
                                }
                                if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                                    if (error)
                                        return "updateTime." + error;
                                }
                                if (message.referencingDatabases != null && message.hasOwnProperty("referencingDatabases")) {
                                    if (!Array.isArray(message.referencingDatabases))
                                        return "referencingDatabases: array expected";
                                    for (var i = 0; i < message.referencingDatabases.length; ++i)
                                        if (!$util.isString(message.referencingDatabases[i]))
                                            return "referencingDatabases: string[] expected";
                                }
                                if (message.referencingBackups != null && message.hasOwnProperty("referencingBackups")) {
                                    if (!Array.isArray(message.referencingBackups))
                                        return "referencingBackups: array expected";
                                    for (var i = 0; i < message.referencingBackups.length; ++i)
                                        if (!$util.isString(message.referencingBackups[i]))
                                            return "referencingBackups: string[] expected";
                                }
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    if (!$util.isString(message.etag))
                                        return "etag: string expected";
                                return null;
                            };
    
                            /**
                             * Creates an InstancePartition message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.InstancePartition} InstancePartition
                             */
                            InstancePartition.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.InstancePartition)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.InstancePartition();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.config != null)
                                    message.config = String(object.config);
                                if (object.displayName != null)
                                    message.displayName = String(object.displayName);
                                if (object.nodeCount != null)
                                    message.nodeCount = object.nodeCount | 0;
                                if (object.processingUnits != null)
                                    message.processingUnits = object.processingUnits | 0;
                                if (object.autoscalingConfig != null) {
                                    if (typeof object.autoscalingConfig !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.InstancePartition.autoscalingConfig: object expected");
                                    message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.fromObject(object.autoscalingConfig);
                                }
                                switch (object.state) {
                                default:
                                    if (typeof object.state === "number") {
                                        message.state = object.state;
                                        break;
                                    }
                                    break;
                                case "STATE_UNSPECIFIED":
                                case 0:
                                    message.state = 0;
                                    break;
                                case "CREATING":
                                case 1:
                                    message.state = 1;
                                    break;
                                case "READY":
                                case 2:
                                    message.state = 2;
                                    break;
                                }
                                if (object.createTime != null) {
                                    if (typeof object.createTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.InstancePartition.createTime: object expected");
                                    message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                                }
                                if (object.updateTime != null) {
                                    if (typeof object.updateTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.InstancePartition.updateTime: object expected");
                                    message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                                }
                                if (object.referencingDatabases) {
                                    if (!Array.isArray(object.referencingDatabases))
                                        throw TypeError(".google.spanner.admin.instance.v1.InstancePartition.referencingDatabases: array expected");
                                    message.referencingDatabases = [];
                                    for (var i = 0; i < object.referencingDatabases.length; ++i)
                                        message.referencingDatabases[i] = String(object.referencingDatabases[i]);
                                }
                                if (object.referencingBackups) {
                                    if (!Array.isArray(object.referencingBackups))
                                        throw TypeError(".google.spanner.admin.instance.v1.InstancePartition.referencingBackups: array expected");
                                    message.referencingBackups = [];
                                    for (var i = 0; i < object.referencingBackups.length; ++i)
                                        message.referencingBackups[i] = String(object.referencingBackups[i]);
                                }
                                if (object.etag != null)
                                    message.etag = String(object.etag);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an InstancePartition message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {google.spanner.admin.instance.v1.InstancePartition} message InstancePartition
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            InstancePartition.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.referencingDatabases = [];
                                    object.referencingBackups = [];
                                }
                                if (options.defaults) {
                                    object.name = "";
                                    object.config = "";
                                    object.displayName = "";
                                    object.state = options.enums === String ? "STATE_UNSPECIFIED" : 0;
                                    object.createTime = null;
                                    object.updateTime = null;
                                    object.etag = "";
                                    object.autoscalingConfig = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.config != null && message.hasOwnProperty("config"))
                                    object.config = message.config;
                                if (message.displayName != null && message.hasOwnProperty("displayName"))
                                    object.displayName = message.displayName;
                                if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                    object.nodeCount = message.nodeCount;
                                    if (options.oneofs)
                                        object.computeCapacity = "nodeCount";
                                }
                                if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                    object.processingUnits = message.processingUnits;
                                    if (options.oneofs)
                                        object.computeCapacity = "processingUnits";
                                }
                                if (message.state != null && message.hasOwnProperty("state"))
                                    object.state = options.enums === String ? $root.google.spanner.admin.instance.v1.InstancePartition.State[message.state] === undefined ? message.state : $root.google.spanner.admin.instance.v1.InstancePartition.State[message.state] : message.state;
                                if (message.createTime != null && message.hasOwnProperty("createTime"))
                                    object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                                if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                                    object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                                if (message.referencingDatabases && message.referencingDatabases.length) {
                                    object.referencingDatabases = [];
                                    for (var j = 0; j < message.referencingDatabases.length; ++j)
                                        object.referencingDatabases[j] = message.referencingDatabases[j];
                                }
                                if (message.referencingBackups && message.referencingBackups.length) {
                                    object.referencingBackups = [];
                                    for (var j = 0; j < message.referencingBackups.length; ++j)
                                        object.referencingBackups[j] = message.referencingBackups[j];
                                }
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    object.etag = message.etag;
                                if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig"))
                                    object.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.toObject(message.autoscalingConfig, options);
                                return object;
                            };
    
                            /**
                             * Converts this InstancePartition to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            InstancePartition.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for InstancePartition
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.InstancePartition
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            InstancePartition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.InstancePartition";
                            };
    
                            /**
                             * State enum.
                             * @name google.spanner.admin.instance.v1.InstancePartition.State
                             * @enum {number}
                             * @property {number} STATE_UNSPECIFIED=0 STATE_UNSPECIFIED value
                             * @property {number} CREATING=1 CREATING value
                             * @property {number} READY=2 READY value
                             */
                            InstancePartition.State = (function() {
                                var valuesById = {}, values = Object.create(valuesById);
                                values[valuesById[0] = "STATE_UNSPECIFIED"] = 0;
                                values[valuesById[1] = "CREATING"] = 1;
                                values[valuesById[2] = "READY"] = 2;
                                return values;
                            })();
    
                            return InstancePartition;
                        })();
    
                        v1.CreateInstancePartitionMetadata = (function() {
    
                            /**
                             * Properties of a CreateInstancePartitionMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstancePartitionMetadata
                             * @property {google.spanner.admin.instance.v1.IInstancePartition|null} [instancePartition] CreateInstancePartitionMetadata instancePartition
                             * @property {google.protobuf.ITimestamp|null} [startTime] CreateInstancePartitionMetadata startTime
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] CreateInstancePartitionMetadata cancelTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] CreateInstancePartitionMetadata endTime
                             */
    
                            /**
                             * Constructs a new CreateInstancePartitionMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstancePartitionMetadata.
                             * @implements ICreateInstancePartitionMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionMetadata=} [properties] Properties to set
                             */
                            function CreateInstancePartitionMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstancePartitionMetadata instancePartition.
                             * @member {google.spanner.admin.instance.v1.IInstancePartition|null|undefined} instancePartition
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @instance
                             */
                            CreateInstancePartitionMetadata.prototype.instancePartition = null;
    
                            /**
                             * CreateInstancePartitionMetadata startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @instance
                             */
                            CreateInstancePartitionMetadata.prototype.startTime = null;
    
                            /**
                             * CreateInstancePartitionMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @instance
                             */
                            CreateInstancePartitionMetadata.prototype.cancelTime = null;
    
                            /**
                             * CreateInstancePartitionMetadata endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @instance
                             */
                            CreateInstancePartitionMetadata.prototype.endTime = null;
    
                            /**
                             * Creates a new CreateInstancePartitionMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionMetadata} CreateInstancePartitionMetadata instance
                             */
                            CreateInstancePartitionMetadata.create = function create(properties) {
                                return new CreateInstancePartitionMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstancePartitionMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionMetadata} message CreateInstancePartitionMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstancePartitionMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instancePartition != null && Object.hasOwnProperty.call(message, "instancePartition"))
                                    $root.google.spanner.admin.instance.v1.InstancePartition.encode(message.instancePartition, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstancePartitionMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionMetadata} message CreateInstancePartitionMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstancePartitionMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstancePartitionMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionMetadata} CreateInstancePartitionMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstancePartitionMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstancePartitionMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstancePartitionMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionMetadata} CreateInstancePartitionMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstancePartitionMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstancePartitionMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstancePartitionMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstancePartition.verify(message.instancePartition);
                                    if (error)
                                        return "instancePartition." + error;
                                }
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstancePartitionMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionMetadata} CreateInstancePartitionMetadata
                             */
                            CreateInstancePartitionMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstancePartitionMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstancePartitionMetadata();
                                if (object.instancePartition != null) {
                                    if (typeof object.instancePartition !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.instancePartition: object expected");
                                    message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.fromObject(object.instancePartition);
                                }
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstancePartitionMetadata.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstancePartitionMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstancePartitionMetadata} message CreateInstancePartitionMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstancePartitionMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instancePartition = null;
                                    object.startTime = null;
                                    object.cancelTime = null;
                                    object.endTime = null;
                                }
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    object.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.toObject(message.instancePartition, options);
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstancePartitionMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstancePartitionMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstancePartitionMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstancePartitionMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstancePartitionMetadata";
                            };
    
                            return CreateInstancePartitionMetadata;
                        })();
    
                        v1.CreateInstancePartitionRequest = (function() {
    
                            /**
                             * Properties of a CreateInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface ICreateInstancePartitionRequest
                             * @property {string|null} [parent] CreateInstancePartitionRequest parent
                             * @property {string|null} [instancePartitionId] CreateInstancePartitionRequest instancePartitionId
                             * @property {google.spanner.admin.instance.v1.IInstancePartition|null} [instancePartition] CreateInstancePartitionRequest instancePartition
                             */
    
                            /**
                             * Constructs a new CreateInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a CreateInstancePartitionRequest.
                             * @implements ICreateInstancePartitionRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest=} [properties] Properties to set
                             */
                            function CreateInstancePartitionRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * CreateInstancePartitionRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @instance
                             */
                            CreateInstancePartitionRequest.prototype.parent = "";
    
                            /**
                             * CreateInstancePartitionRequest instancePartitionId.
                             * @member {string} instancePartitionId
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @instance
                             */
                            CreateInstancePartitionRequest.prototype.instancePartitionId = "";
    
                            /**
                             * CreateInstancePartitionRequest instancePartition.
                             * @member {google.spanner.admin.instance.v1.IInstancePartition|null|undefined} instancePartition
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @instance
                             */
                            CreateInstancePartitionRequest.prototype.instancePartition = null;
    
                            /**
                             * Creates a new CreateInstancePartitionRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionRequest} CreateInstancePartitionRequest instance
                             */
                            CreateInstancePartitionRequest.create = function create(properties) {
                                return new CreateInstancePartitionRequest(properties);
                            };
    
                            /**
                             * Encodes the specified CreateInstancePartitionRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstancePartitionRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest} message CreateInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstancePartitionRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.instancePartitionId != null && Object.hasOwnProperty.call(message, "instancePartitionId"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.instancePartitionId);
                                if (message.instancePartition != null && Object.hasOwnProperty.call(message, "instancePartition"))
                                    $root.google.spanner.admin.instance.v1.InstancePartition.encode(message.instancePartition, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified CreateInstancePartitionRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.CreateInstancePartitionRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ICreateInstancePartitionRequest} message CreateInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            CreateInstancePartitionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a CreateInstancePartitionRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionRequest} CreateInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstancePartitionRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.CreateInstancePartitionRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.instancePartitionId = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a CreateInstancePartitionRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionRequest} CreateInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            CreateInstancePartitionRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a CreateInstancePartitionRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            CreateInstancePartitionRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.instancePartitionId != null && message.hasOwnProperty("instancePartitionId"))
                                    if (!$util.isString(message.instancePartitionId))
                                        return "instancePartitionId: string expected";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstancePartition.verify(message.instancePartition);
                                    if (error)
                                        return "instancePartition." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a CreateInstancePartitionRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.CreateInstancePartitionRequest} CreateInstancePartitionRequest
                             */
                            CreateInstancePartitionRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.CreateInstancePartitionRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.CreateInstancePartitionRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.instancePartitionId != null)
                                    message.instancePartitionId = String(object.instancePartitionId);
                                if (object.instancePartition != null) {
                                    if (typeof object.instancePartition !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.CreateInstancePartitionRequest.instancePartition: object expected");
                                    message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.fromObject(object.instancePartition);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a CreateInstancePartitionRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.CreateInstancePartitionRequest} message CreateInstancePartitionRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            CreateInstancePartitionRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.instancePartitionId = "";
                                    object.instancePartition = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.instancePartitionId != null && message.hasOwnProperty("instancePartitionId"))
                                    object.instancePartitionId = message.instancePartitionId;
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    object.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.toObject(message.instancePartition, options);
                                return object;
                            };
    
                            /**
                             * Converts this CreateInstancePartitionRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            CreateInstancePartitionRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for CreateInstancePartitionRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.CreateInstancePartitionRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            CreateInstancePartitionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.CreateInstancePartitionRequest";
                            };
    
                            return CreateInstancePartitionRequest;
                        })();
    
                        v1.DeleteInstancePartitionRequest = (function() {
    
                            /**
                             * Properties of a DeleteInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IDeleteInstancePartitionRequest
                             * @property {string|null} [name] DeleteInstancePartitionRequest name
                             * @property {string|null} [etag] DeleteInstancePartitionRequest etag
                             */
    
                            /**
                             * Constructs a new DeleteInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a DeleteInstancePartitionRequest.
                             * @implements IDeleteInstancePartitionRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest=} [properties] Properties to set
                             */
                            function DeleteInstancePartitionRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * DeleteInstancePartitionRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @instance
                             */
                            DeleteInstancePartitionRequest.prototype.name = "";
    
                            /**
                             * DeleteInstancePartitionRequest etag.
                             * @member {string} etag
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @instance
                             */
                            DeleteInstancePartitionRequest.prototype.etag = "";
    
                            /**
                             * Creates a new DeleteInstancePartitionRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.DeleteInstancePartitionRequest} DeleteInstancePartitionRequest instance
                             */
                            DeleteInstancePartitionRequest.create = function create(properties) {
                                return new DeleteInstancePartitionRequest(properties);
                            };
    
                            /**
                             * Encodes the specified DeleteInstancePartitionRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstancePartitionRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest} message DeleteInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstancePartitionRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.etag != null && Object.hasOwnProperty.call(message, "etag"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.etag);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified DeleteInstancePartitionRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.DeleteInstancePartitionRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IDeleteInstancePartitionRequest} message DeleteInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            DeleteInstancePartitionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a DeleteInstancePartitionRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.DeleteInstancePartitionRequest} DeleteInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstancePartitionRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.DeleteInstancePartitionRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.etag = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a DeleteInstancePartitionRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.DeleteInstancePartitionRequest} DeleteInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            DeleteInstancePartitionRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a DeleteInstancePartitionRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            DeleteInstancePartitionRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    if (!$util.isString(message.etag))
                                        return "etag: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a DeleteInstancePartitionRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.DeleteInstancePartitionRequest} DeleteInstancePartitionRequest
                             */
                            DeleteInstancePartitionRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.DeleteInstancePartitionRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.DeleteInstancePartitionRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.etag != null)
                                    message.etag = String(object.etag);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a DeleteInstancePartitionRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.DeleteInstancePartitionRequest} message DeleteInstancePartitionRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            DeleteInstancePartitionRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.etag = "";
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.etag != null && message.hasOwnProperty("etag"))
                                    object.etag = message.etag;
                                return object;
                            };
    
                            /**
                             * Converts this DeleteInstancePartitionRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            DeleteInstancePartitionRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for DeleteInstancePartitionRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.DeleteInstancePartitionRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            DeleteInstancePartitionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.DeleteInstancePartitionRequest";
                            };
    
                            return DeleteInstancePartitionRequest;
                        })();
    
                        v1.GetInstancePartitionRequest = (function() {
    
                            /**
                             * Properties of a GetInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IGetInstancePartitionRequest
                             * @property {string|null} [name] GetInstancePartitionRequest name
                             */
    
                            /**
                             * Constructs a new GetInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a GetInstancePartitionRequest.
                             * @implements IGetInstancePartitionRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest=} [properties] Properties to set
                             */
                            function GetInstancePartitionRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * GetInstancePartitionRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @instance
                             */
                            GetInstancePartitionRequest.prototype.name = "";
    
                            /**
                             * Creates a new GetInstancePartitionRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.GetInstancePartitionRequest} GetInstancePartitionRequest instance
                             */
                            GetInstancePartitionRequest.create = function create(properties) {
                                return new GetInstancePartitionRequest(properties);
                            };
    
                            /**
                             * Encodes the specified GetInstancePartitionRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstancePartitionRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest} message GetInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstancePartitionRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified GetInstancePartitionRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.GetInstancePartitionRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IGetInstancePartitionRequest} message GetInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            GetInstancePartitionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a GetInstancePartitionRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.GetInstancePartitionRequest} GetInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstancePartitionRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.GetInstancePartitionRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a GetInstancePartitionRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.GetInstancePartitionRequest} GetInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            GetInstancePartitionRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a GetInstancePartitionRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            GetInstancePartitionRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a GetInstancePartitionRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.GetInstancePartitionRequest} GetInstancePartitionRequest
                             */
                            GetInstancePartitionRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.GetInstancePartitionRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.GetInstancePartitionRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a GetInstancePartitionRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.GetInstancePartitionRequest} message GetInstancePartitionRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            GetInstancePartitionRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.name = "";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                return object;
                            };
    
                            /**
                             * Converts this GetInstancePartitionRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            GetInstancePartitionRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for GetInstancePartitionRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.GetInstancePartitionRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            GetInstancePartitionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.GetInstancePartitionRequest";
                            };
    
                            return GetInstancePartitionRequest;
                        })();
    
                        v1.UpdateInstancePartitionRequest = (function() {
    
                            /**
                             * Properties of an UpdateInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstancePartitionRequest
                             * @property {google.spanner.admin.instance.v1.IInstancePartition|null} [instancePartition] UpdateInstancePartitionRequest instancePartition
                             * @property {google.protobuf.IFieldMask|null} [fieldMask] UpdateInstancePartitionRequest fieldMask
                             */
    
                            /**
                             * Constructs a new UpdateInstancePartitionRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstancePartitionRequest.
                             * @implements IUpdateInstancePartitionRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest=} [properties] Properties to set
                             */
                            function UpdateInstancePartitionRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstancePartitionRequest instancePartition.
                             * @member {google.spanner.admin.instance.v1.IInstancePartition|null|undefined} instancePartition
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @instance
                             */
                            UpdateInstancePartitionRequest.prototype.instancePartition = null;
    
                            /**
                             * UpdateInstancePartitionRequest fieldMask.
                             * @member {google.protobuf.IFieldMask|null|undefined} fieldMask
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @instance
                             */
                            UpdateInstancePartitionRequest.prototype.fieldMask = null;
    
                            /**
                             * Creates a new UpdateInstancePartitionRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionRequest} UpdateInstancePartitionRequest instance
                             */
                            UpdateInstancePartitionRequest.create = function create(properties) {
                                return new UpdateInstancePartitionRequest(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstancePartitionRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstancePartitionRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest} message UpdateInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstancePartitionRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instancePartition != null && Object.hasOwnProperty.call(message, "instancePartition"))
                                    $root.google.spanner.admin.instance.v1.InstancePartition.encode(message.instancePartition, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.fieldMask != null && Object.hasOwnProperty.call(message, "fieldMask"))
                                    $root.google.protobuf.FieldMask.encode(message.fieldMask, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstancePartitionRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstancePartitionRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionRequest} message UpdateInstancePartitionRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstancePartitionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstancePartitionRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionRequest} UpdateInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstancePartitionRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstancePartitionRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.fieldMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstancePartitionRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionRequest} UpdateInstancePartitionRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstancePartitionRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstancePartitionRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstancePartitionRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstancePartition.verify(message.instancePartition);
                                    if (error)
                                        return "instancePartition." + error;
                                }
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask")) {
                                    var error = $root.google.protobuf.FieldMask.verify(message.fieldMask);
                                    if (error)
                                        return "fieldMask." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstancePartitionRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionRequest} UpdateInstancePartitionRequest
                             */
                            UpdateInstancePartitionRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstancePartitionRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstancePartitionRequest();
                                if (object.instancePartition != null) {
                                    if (typeof object.instancePartition !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionRequest.instancePartition: object expected");
                                    message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.fromObject(object.instancePartition);
                                }
                                if (object.fieldMask != null) {
                                    if (typeof object.fieldMask !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionRequest.fieldMask: object expected");
                                    message.fieldMask = $root.google.protobuf.FieldMask.fromObject(object.fieldMask);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstancePartitionRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstancePartitionRequest} message UpdateInstancePartitionRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstancePartitionRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instancePartition = null;
                                    object.fieldMask = null;
                                }
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    object.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.toObject(message.instancePartition, options);
                                if (message.fieldMask != null && message.hasOwnProperty("fieldMask"))
                                    object.fieldMask = $root.google.protobuf.FieldMask.toObject(message.fieldMask, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstancePartitionRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstancePartitionRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstancePartitionRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstancePartitionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstancePartitionRequest";
                            };
    
                            return UpdateInstancePartitionRequest;
                        })();
    
                        v1.UpdateInstancePartitionMetadata = (function() {
    
                            /**
                             * Properties of an UpdateInstancePartitionMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IUpdateInstancePartitionMetadata
                             * @property {google.spanner.admin.instance.v1.IInstancePartition|null} [instancePartition] UpdateInstancePartitionMetadata instancePartition
                             * @property {google.protobuf.ITimestamp|null} [startTime] UpdateInstancePartitionMetadata startTime
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] UpdateInstancePartitionMetadata cancelTime
                             * @property {google.protobuf.ITimestamp|null} [endTime] UpdateInstancePartitionMetadata endTime
                             */
    
                            /**
                             * Constructs a new UpdateInstancePartitionMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents an UpdateInstancePartitionMetadata.
                             * @implements IUpdateInstancePartitionMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionMetadata=} [properties] Properties to set
                             */
                            function UpdateInstancePartitionMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateInstancePartitionMetadata instancePartition.
                             * @member {google.spanner.admin.instance.v1.IInstancePartition|null|undefined} instancePartition
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @instance
                             */
                            UpdateInstancePartitionMetadata.prototype.instancePartition = null;
    
                            /**
                             * UpdateInstancePartitionMetadata startTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} startTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @instance
                             */
                            UpdateInstancePartitionMetadata.prototype.startTime = null;
    
                            /**
                             * UpdateInstancePartitionMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @instance
                             */
                            UpdateInstancePartitionMetadata.prototype.cancelTime = null;
    
                            /**
                             * UpdateInstancePartitionMetadata endTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} endTime
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @instance
                             */
                            UpdateInstancePartitionMetadata.prototype.endTime = null;
    
                            /**
                             * Creates a new UpdateInstancePartitionMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata} UpdateInstancePartitionMetadata instance
                             */
                            UpdateInstancePartitionMetadata.create = function create(properties) {
                                return new UpdateInstancePartitionMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateInstancePartitionMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionMetadata} message UpdateInstancePartitionMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstancePartitionMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instancePartition != null && Object.hasOwnProperty.call(message, "instancePartition"))
                                    $root.google.spanner.admin.instance.v1.InstancePartition.encode(message.instancePartition, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                    $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                    $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateInstancePartitionMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IUpdateInstancePartitionMetadata} message UpdateInstancePartitionMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateInstancePartitionMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateInstancePartitionMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata} UpdateInstancePartitionMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstancePartitionMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 2: {
                                            message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateInstancePartitionMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata} UpdateInstancePartitionMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateInstancePartitionMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateInstancePartitionMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateInstancePartitionMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition")) {
                                    var error = $root.google.spanner.admin.instance.v1.InstancePartition.verify(message.instancePartition);
                                    if (error)
                                        return "instancePartition." + error;
                                }
                                if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                    if (error)
                                        return "startTime." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateInstancePartitionMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata} UpdateInstancePartitionMetadata
                             */
                            UpdateInstancePartitionMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata();
                                if (object.instancePartition != null) {
                                    if (typeof object.instancePartition !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.instancePartition: object expected");
                                    message.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.fromObject(object.instancePartition);
                                }
                                if (object.startTime != null) {
                                    if (typeof object.startTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.startTime: object expected");
                                    message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                if (object.endTime != null) {
                                    if (typeof object.endTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata.endTime: object expected");
                                    message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateInstancePartitionMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata} message UpdateInstancePartitionMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateInstancePartitionMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.instancePartition = null;
                                    object.startTime = null;
                                    object.cancelTime = null;
                                    object.endTime = null;
                                }
                                if (message.instancePartition != null && message.hasOwnProperty("instancePartition"))
                                    object.instancePartition = $root.google.spanner.admin.instance.v1.InstancePartition.toObject(message.instancePartition, options);
                                if (message.startTime != null && message.hasOwnProperty("startTime"))
                                    object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                if (message.endTime != null && message.hasOwnProperty("endTime"))
                                    object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this UpdateInstancePartitionMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateInstancePartitionMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateInstancePartitionMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateInstancePartitionMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.UpdateInstancePartitionMetadata";
                            };
    
                            return UpdateInstancePartitionMetadata;
                        })();
    
                        v1.ListInstancePartitionsRequest = (function() {
    
                            /**
                             * Properties of a ListInstancePartitionsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancePartitionsRequest
                             * @property {string|null} [parent] ListInstancePartitionsRequest parent
                             * @property {number|null} [pageSize] ListInstancePartitionsRequest pageSize
                             * @property {string|null} [pageToken] ListInstancePartitionsRequest pageToken
                             * @property {google.protobuf.ITimestamp|null} [instancePartitionDeadline] ListInstancePartitionsRequest instancePartitionDeadline
                             */
    
                            /**
                             * Constructs a new ListInstancePartitionsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancePartitionsRequest.
                             * @implements IListInstancePartitionsRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest=} [properties] Properties to set
                             */
                            function ListInstancePartitionsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancePartitionsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @instance
                             */
                            ListInstancePartitionsRequest.prototype.parent = "";
    
                            /**
                             * ListInstancePartitionsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @instance
                             */
                            ListInstancePartitionsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListInstancePartitionsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @instance
                             */
                            ListInstancePartitionsRequest.prototype.pageToken = "";
    
                            /**
                             * ListInstancePartitionsRequest instancePartitionDeadline.
                             * @member {google.protobuf.ITimestamp|null|undefined} instancePartitionDeadline
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @instance
                             */
                            ListInstancePartitionsRequest.prototype.instancePartitionDeadline = null;
    
                            /**
                             * Creates a new ListInstancePartitionsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsRequest} ListInstancePartitionsRequest instance
                             */
                            ListInstancePartitionsRequest.create = function create(properties) {
                                return new ListInstancePartitionsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionsRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest} message ListInstancePartitionsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                                if (message.instancePartitionDeadline != null && Object.hasOwnProperty.call(message, "instancePartitionDeadline"))
                                    $root.google.protobuf.Timestamp.encode(message.instancePartitionDeadline, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsRequest} message ListInstancePartitionsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancePartitionsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsRequest} ListInstancePartitionsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 3: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    case 4: {
                                            message.instancePartitionDeadline = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancePartitionsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsRequest} ListInstancePartitionsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancePartitionsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancePartitionsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                if (message.instancePartitionDeadline != null && message.hasOwnProperty("instancePartitionDeadline")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.instancePartitionDeadline);
                                    if (error)
                                        return "instancePartitionDeadline." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancePartitionsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsRequest} ListInstancePartitionsRequest
                             */
                            ListInstancePartitionsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancePartitionsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                if (object.instancePartitionDeadline != null) {
                                    if (typeof object.instancePartitionDeadline !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionsRequest.instancePartitionDeadline: object expected");
                                    message.instancePartitionDeadline = $root.google.protobuf.Timestamp.fromObject(object.instancePartitionDeadline);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancePartitionsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionsRequest} message ListInstancePartitionsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancePartitionsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                    object.instancePartitionDeadline = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                if (message.instancePartitionDeadline != null && message.hasOwnProperty("instancePartitionDeadline"))
                                    object.instancePartitionDeadline = $root.google.protobuf.Timestamp.toObject(message.instancePartitionDeadline, options);
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancePartitionsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancePartitionsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancePartitionsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancePartitionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancePartitionsRequest";
                            };
    
                            return ListInstancePartitionsRequest;
                        })();
    
                        v1.ListInstancePartitionsResponse = (function() {
    
                            /**
                             * Properties of a ListInstancePartitionsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancePartitionsResponse
                             * @property {Array.<google.spanner.admin.instance.v1.IInstancePartition>|null} [instancePartitions] ListInstancePartitionsResponse instancePartitions
                             * @property {string|null} [nextPageToken] ListInstancePartitionsResponse nextPageToken
                             * @property {Array.<string>|null} [unreachable] ListInstancePartitionsResponse unreachable
                             */
    
                            /**
                             * Constructs a new ListInstancePartitionsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancePartitionsResponse.
                             * @implements IListInstancePartitionsResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsResponse=} [properties] Properties to set
                             */
                            function ListInstancePartitionsResponse(properties) {
                                this.instancePartitions = [];
                                this.unreachable = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancePartitionsResponse instancePartitions.
                             * @member {Array.<google.spanner.admin.instance.v1.IInstancePartition>} instancePartitions
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @instance
                             */
                            ListInstancePartitionsResponse.prototype.instancePartitions = $util.emptyArray;
    
                            /**
                             * ListInstancePartitionsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @instance
                             */
                            ListInstancePartitionsResponse.prototype.nextPageToken = "";
    
                            /**
                             * ListInstancePartitionsResponse unreachable.
                             * @member {Array.<string>} unreachable
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @instance
                             */
                            ListInstancePartitionsResponse.prototype.unreachable = $util.emptyArray;
    
                            /**
                             * Creates a new ListInstancePartitionsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} ListInstancePartitionsResponse instance
                             */
                            ListInstancePartitionsResponse.create = function create(properties) {
                                return new ListInstancePartitionsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionsResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsResponse} message ListInstancePartitionsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.instancePartitions != null && message.instancePartitions.length)
                                    for (var i = 0; i < message.instancePartitions.length; ++i)
                                        $root.google.spanner.admin.instance.v1.InstancePartition.encode(message.instancePartitions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                if (message.unreachable != null && message.unreachable.length)
                                    for (var i = 0; i < message.unreachable.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.unreachable[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionsResponse} message ListInstancePartitionsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancePartitionsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} ListInstancePartitionsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.instancePartitions && message.instancePartitions.length))
                                                message.instancePartitions = [];
                                            message.instancePartitions.push($root.google.spanner.admin.instance.v1.InstancePartition.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.unreachable && message.unreachable.length))
                                                message.unreachable = [];
                                            message.unreachable.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancePartitionsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} ListInstancePartitionsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancePartitionsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancePartitionsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.instancePartitions != null && message.hasOwnProperty("instancePartitions")) {
                                    if (!Array.isArray(message.instancePartitions))
                                        return "instancePartitions: array expected";
                                    for (var i = 0; i < message.instancePartitions.length; ++i) {
                                        var error = $root.google.spanner.admin.instance.v1.InstancePartition.verify(message.instancePartitions[i]);
                                        if (error)
                                            return "instancePartitions." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                if (message.unreachable != null && message.hasOwnProperty("unreachable")) {
                                    if (!Array.isArray(message.unreachable))
                                        return "unreachable: array expected";
                                    for (var i = 0; i < message.unreachable.length; ++i)
                                        if (!$util.isString(message.unreachable[i]))
                                            return "unreachable: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancePartitionsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} ListInstancePartitionsResponse
                             */
                            ListInstancePartitionsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancePartitionsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionsResponse();
                                if (object.instancePartitions) {
                                    if (!Array.isArray(object.instancePartitions))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionsResponse.instancePartitions: array expected");
                                    message.instancePartitions = [];
                                    for (var i = 0; i < object.instancePartitions.length; ++i) {
                                        if (typeof object.instancePartitions[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionsResponse.instancePartitions: object expected");
                                        message.instancePartitions[i] = $root.google.spanner.admin.instance.v1.InstancePartition.fromObject(object.instancePartitions[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                if (object.unreachable) {
                                    if (!Array.isArray(object.unreachable))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionsResponse.unreachable: array expected");
                                    message.unreachable = [];
                                    for (var i = 0; i < object.unreachable.length; ++i)
                                        message.unreachable[i] = String(object.unreachable[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancePartitionsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionsResponse} message ListInstancePartitionsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancePartitionsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.instancePartitions = [];
                                    object.unreachable = [];
                                }
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.instancePartitions && message.instancePartitions.length) {
                                    object.instancePartitions = [];
                                    for (var j = 0; j < message.instancePartitions.length; ++j)
                                        object.instancePartitions[j] = $root.google.spanner.admin.instance.v1.InstancePartition.toObject(message.instancePartitions[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                if (message.unreachable && message.unreachable.length) {
                                    object.unreachable = [];
                                    for (var j = 0; j < message.unreachable.length; ++j)
                                        object.unreachable[j] = message.unreachable[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancePartitionsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancePartitionsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancePartitionsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancePartitionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancePartitionsResponse";
                            };
    
                            return ListInstancePartitionsResponse;
                        })();
    
                        v1.ListInstancePartitionOperationsRequest = (function() {
    
                            /**
                             * Properties of a ListInstancePartitionOperationsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancePartitionOperationsRequest
                             * @property {string|null} [parent] ListInstancePartitionOperationsRequest parent
                             * @property {string|null} [filter] ListInstancePartitionOperationsRequest filter
                             * @property {number|null} [pageSize] ListInstancePartitionOperationsRequest pageSize
                             * @property {string|null} [pageToken] ListInstancePartitionOperationsRequest pageToken
                             * @property {google.protobuf.ITimestamp|null} [instancePartitionDeadline] ListInstancePartitionOperationsRequest instancePartitionDeadline
                             */
    
                            /**
                             * Constructs a new ListInstancePartitionOperationsRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancePartitionOperationsRequest.
                             * @implements IListInstancePartitionOperationsRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest=} [properties] Properties to set
                             */
                            function ListInstancePartitionOperationsRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancePartitionOperationsRequest parent.
                             * @member {string} parent
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             */
                            ListInstancePartitionOperationsRequest.prototype.parent = "";
    
                            /**
                             * ListInstancePartitionOperationsRequest filter.
                             * @member {string} filter
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             */
                            ListInstancePartitionOperationsRequest.prototype.filter = "";
    
                            /**
                             * ListInstancePartitionOperationsRequest pageSize.
                             * @member {number} pageSize
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             */
                            ListInstancePartitionOperationsRequest.prototype.pageSize = 0;
    
                            /**
                             * ListInstancePartitionOperationsRequest pageToken.
                             * @member {string} pageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             */
                            ListInstancePartitionOperationsRequest.prototype.pageToken = "";
    
                            /**
                             * ListInstancePartitionOperationsRequest instancePartitionDeadline.
                             * @member {google.protobuf.ITimestamp|null|undefined} instancePartitionDeadline
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             */
                            ListInstancePartitionOperationsRequest.prototype.instancePartitionDeadline = null;
    
                            /**
                             * Creates a new ListInstancePartitionOperationsRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest} ListInstancePartitionOperationsRequest instance
                             */
                            ListInstancePartitionOperationsRequest.create = function create(properties) {
                                return new ListInstancePartitionOperationsRequest(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionOperationsRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest} message ListInstancePartitionOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionOperationsRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                                if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                                if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                                if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                                if (message.instancePartitionDeadline != null && Object.hasOwnProperty.call(message, "instancePartitionDeadline"))
                                    $root.google.protobuf.Timestamp.encode(message.instancePartitionDeadline, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionOperationsRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsRequest} message ListInstancePartitionOperationsRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancePartitionOperationsRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest} ListInstancePartitionOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionOperationsRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.parent = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.filter = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.pageSize = reader.int32();
                                            break;
                                        }
                                    case 4: {
                                            message.pageToken = reader.string();
                                            break;
                                        }
                                    case 5: {
                                            message.instancePartitionDeadline = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancePartitionOperationsRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest} ListInstancePartitionOperationsRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancePartitionOperationsRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancePartitionOperationsRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    if (!$util.isString(message.parent))
                                        return "parent: string expected";
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    if (!$util.isString(message.filter))
                                        return "filter: string expected";
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    if (!$util.isInteger(message.pageSize))
                                        return "pageSize: integer expected";
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    if (!$util.isString(message.pageToken))
                                        return "pageToken: string expected";
                                if (message.instancePartitionDeadline != null && message.hasOwnProperty("instancePartitionDeadline")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.instancePartitionDeadline);
                                    if (error)
                                        return "instancePartitionDeadline." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancePartitionOperationsRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest} ListInstancePartitionOperationsRequest
                             */
                            ListInstancePartitionOperationsRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest();
                                if (object.parent != null)
                                    message.parent = String(object.parent);
                                if (object.filter != null)
                                    message.filter = String(object.filter);
                                if (object.pageSize != null)
                                    message.pageSize = object.pageSize | 0;
                                if (object.pageToken != null)
                                    message.pageToken = String(object.pageToken);
                                if (object.instancePartitionDeadline != null) {
                                    if (typeof object.instancePartitionDeadline !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest.instancePartitionDeadline: object expected");
                                    message.instancePartitionDeadline = $root.google.protobuf.Timestamp.fromObject(object.instancePartitionDeadline);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancePartitionOperationsRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest} message ListInstancePartitionOperationsRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancePartitionOperationsRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.parent = "";
                                    object.filter = "";
                                    object.pageSize = 0;
                                    object.pageToken = "";
                                    object.instancePartitionDeadline = null;
                                }
                                if (message.parent != null && message.hasOwnProperty("parent"))
                                    object.parent = message.parent;
                                if (message.filter != null && message.hasOwnProperty("filter"))
                                    object.filter = message.filter;
                                if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                    object.pageSize = message.pageSize;
                                if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                    object.pageToken = message.pageToken;
                                if (message.instancePartitionDeadline != null && message.hasOwnProperty("instancePartitionDeadline"))
                                    object.instancePartitionDeadline = $root.google.protobuf.Timestamp.toObject(message.instancePartitionDeadline, options);
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancePartitionOperationsRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancePartitionOperationsRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancePartitionOperationsRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancePartitionOperationsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancePartitionOperationsRequest";
                            };
    
                            return ListInstancePartitionOperationsRequest;
                        })();
    
                        v1.ListInstancePartitionOperationsResponse = (function() {
    
                            /**
                             * Properties of a ListInstancePartitionOperationsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IListInstancePartitionOperationsResponse
                             * @property {Array.<google.longrunning.IOperation>|null} [operations] ListInstancePartitionOperationsResponse operations
                             * @property {string|null} [nextPageToken] ListInstancePartitionOperationsResponse nextPageToken
                             * @property {Array.<string>|null} [unreachableInstancePartitions] ListInstancePartitionOperationsResponse unreachableInstancePartitions
                             */
    
                            /**
                             * Constructs a new ListInstancePartitionOperationsResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a ListInstancePartitionOperationsResponse.
                             * @implements IListInstancePartitionOperationsResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsResponse=} [properties] Properties to set
                             */
                            function ListInstancePartitionOperationsResponse(properties) {
                                this.operations = [];
                                this.unreachableInstancePartitions = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ListInstancePartitionOperationsResponse operations.
                             * @member {Array.<google.longrunning.IOperation>} operations
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @instance
                             */
                            ListInstancePartitionOperationsResponse.prototype.operations = $util.emptyArray;
    
                            /**
                             * ListInstancePartitionOperationsResponse nextPageToken.
                             * @member {string} nextPageToken
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @instance
                             */
                            ListInstancePartitionOperationsResponse.prototype.nextPageToken = "";
    
                            /**
                             * ListInstancePartitionOperationsResponse unreachableInstancePartitions.
                             * @member {Array.<string>} unreachableInstancePartitions
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @instance
                             */
                            ListInstancePartitionOperationsResponse.prototype.unreachableInstancePartitions = $util.emptyArray;
    
                            /**
                             * Creates a new ListInstancePartitionOperationsResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} ListInstancePartitionOperationsResponse instance
                             */
                            ListInstancePartitionOperationsResponse.create = function create(properties) {
                                return new ListInstancePartitionOperationsResponse(properties);
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionOperationsResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsResponse} message ListInstancePartitionOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionOperationsResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.operations != null && message.operations.length)
                                    for (var i = 0; i < message.operations.length; ++i)
                                        $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                                if (message.unreachableInstancePartitions != null && message.unreachableInstancePartitions.length)
                                    for (var i = 0; i < message.unreachableInstancePartitions.length; ++i)
                                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.unreachableInstancePartitions[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ListInstancePartitionOperationsResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IListInstancePartitionOperationsResponse} message ListInstancePartitionOperationsResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ListInstancePartitionOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ListInstancePartitionOperationsResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} ListInstancePartitionOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionOperationsResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.operations && message.operations.length))
                                                message.operations = [];
                                            message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            message.nextPageToken = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.unreachableInstancePartitions && message.unreachableInstancePartitions.length))
                                                message.unreachableInstancePartitions = [];
                                            message.unreachableInstancePartitions.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ListInstancePartitionOperationsResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} ListInstancePartitionOperationsResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ListInstancePartitionOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ListInstancePartitionOperationsResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ListInstancePartitionOperationsResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.operations != null && message.hasOwnProperty("operations")) {
                                    if (!Array.isArray(message.operations))
                                        return "operations: array expected";
                                    for (var i = 0; i < message.operations.length; ++i) {
                                        var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                                        if (error)
                                            return "operations." + error;
                                    }
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    if (!$util.isString(message.nextPageToken))
                                        return "nextPageToken: string expected";
                                if (message.unreachableInstancePartitions != null && message.hasOwnProperty("unreachableInstancePartitions")) {
                                    if (!Array.isArray(message.unreachableInstancePartitions))
                                        return "unreachableInstancePartitions: array expected";
                                    for (var i = 0; i < message.unreachableInstancePartitions.length; ++i)
                                        if (!$util.isString(message.unreachableInstancePartitions[i]))
                                            return "unreachableInstancePartitions: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ListInstancePartitionOperationsResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} ListInstancePartitionOperationsResponse
                             */
                            ListInstancePartitionOperationsResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse();
                                if (object.operations) {
                                    if (!Array.isArray(object.operations))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse.operations: array expected");
                                    message.operations = [];
                                    for (var i = 0; i < object.operations.length; ++i) {
                                        if (typeof object.operations[i] !== "object")
                                            throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse.operations: object expected");
                                        message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                                    }
                                }
                                if (object.nextPageToken != null)
                                    message.nextPageToken = String(object.nextPageToken);
                                if (object.unreachableInstancePartitions) {
                                    if (!Array.isArray(object.unreachableInstancePartitions))
                                        throw TypeError(".google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse.unreachableInstancePartitions: array expected");
                                    message.unreachableInstancePartitions = [];
                                    for (var i = 0; i < object.unreachableInstancePartitions.length; ++i)
                                        message.unreachableInstancePartitions[i] = String(object.unreachableInstancePartitions[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ListInstancePartitionOperationsResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse} message ListInstancePartitionOperationsResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ListInstancePartitionOperationsResponse.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.operations = [];
                                    object.unreachableInstancePartitions = [];
                                }
                                if (options.defaults)
                                    object.nextPageToken = "";
                                if (message.operations && message.operations.length) {
                                    object.operations = [];
                                    for (var j = 0; j < message.operations.length; ++j)
                                        object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                                }
                                if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                    object.nextPageToken = message.nextPageToken;
                                if (message.unreachableInstancePartitions && message.unreachableInstancePartitions.length) {
                                    object.unreachableInstancePartitions = [];
                                    for (var j = 0; j < message.unreachableInstancePartitions.length; ++j)
                                        object.unreachableInstancePartitions[j] = message.unreachableInstancePartitions[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ListInstancePartitionOperationsResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ListInstancePartitionOperationsResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ListInstancePartitionOperationsResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ListInstancePartitionOperationsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.ListInstancePartitionOperationsResponse";
                            };
    
                            return ListInstancePartitionOperationsResponse;
                        })();
    
                        v1.MoveInstanceRequest = (function() {
    
                            /**
                             * Properties of a MoveInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IMoveInstanceRequest
                             * @property {string|null} [name] MoveInstanceRequest name
                             * @property {string|null} [targetConfig] MoveInstanceRequest targetConfig
                             */
    
                            /**
                             * Constructs a new MoveInstanceRequest.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a MoveInstanceRequest.
                             * @implements IMoveInstanceRequest
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest=} [properties] Properties to set
                             */
                            function MoveInstanceRequest(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * MoveInstanceRequest name.
                             * @member {string} name
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @instance
                             */
                            MoveInstanceRequest.prototype.name = "";
    
                            /**
                             * MoveInstanceRequest targetConfig.
                             * @member {string} targetConfig
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @instance
                             */
                            MoveInstanceRequest.prototype.targetConfig = "";
    
                            /**
                             * Creates a new MoveInstanceRequest instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceRequest} MoveInstanceRequest instance
                             */
                            MoveInstanceRequest.create = function create(properties) {
                                return new MoveInstanceRequest(properties);
                            };
    
                            /**
                             * Encodes the specified MoveInstanceRequest message. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceRequest.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest} message MoveInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceRequest.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.targetConfig != null && Object.hasOwnProperty.call(message, "targetConfig"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.targetConfig);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified MoveInstanceRequest message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceRequest.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceRequest} message MoveInstanceRequest message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceRequest.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a MoveInstanceRequest message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceRequest} MoveInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceRequest.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.MoveInstanceRequest();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.targetConfig = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a MoveInstanceRequest message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceRequest} MoveInstanceRequest
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceRequest.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a MoveInstanceRequest message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            MoveInstanceRequest.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.targetConfig != null && message.hasOwnProperty("targetConfig"))
                                    if (!$util.isString(message.targetConfig))
                                        return "targetConfig: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a MoveInstanceRequest message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceRequest} MoveInstanceRequest
                             */
                            MoveInstanceRequest.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.MoveInstanceRequest)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.MoveInstanceRequest();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.targetConfig != null)
                                    message.targetConfig = String(object.targetConfig);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a MoveInstanceRequest message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {google.spanner.admin.instance.v1.MoveInstanceRequest} message MoveInstanceRequest
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            MoveInstanceRequest.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.targetConfig = "";
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.targetConfig != null && message.hasOwnProperty("targetConfig"))
                                    object.targetConfig = message.targetConfig;
                                return object;
                            };
    
                            /**
                             * Converts this MoveInstanceRequest to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            MoveInstanceRequest.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for MoveInstanceRequest
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceRequest
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            MoveInstanceRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.MoveInstanceRequest";
                            };
    
                            return MoveInstanceRequest;
                        })();
    
                        v1.MoveInstanceResponse = (function() {
    
                            /**
                             * Properties of a MoveInstanceResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IMoveInstanceResponse
                             */
    
                            /**
                             * Constructs a new MoveInstanceResponse.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a MoveInstanceResponse.
                             * @implements IMoveInstanceResponse
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceResponse=} [properties] Properties to set
                             */
                            function MoveInstanceResponse(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Creates a new MoveInstanceResponse instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceResponse=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceResponse} MoveInstanceResponse instance
                             */
                            MoveInstanceResponse.create = function create(properties) {
                                return new MoveInstanceResponse(properties);
                            };
    
                            /**
                             * Encodes the specified MoveInstanceResponse message. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceResponse.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceResponse} message MoveInstanceResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceResponse.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified MoveInstanceResponse message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceResponse.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceResponse} message MoveInstanceResponse message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceResponse.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a MoveInstanceResponse message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceResponse} MoveInstanceResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceResponse.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.MoveInstanceResponse();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a MoveInstanceResponse message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceResponse} MoveInstanceResponse
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceResponse.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a MoveInstanceResponse message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            MoveInstanceResponse.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                return null;
                            };
    
                            /**
                             * Creates a MoveInstanceResponse message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceResponse} MoveInstanceResponse
                             */
                            MoveInstanceResponse.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.MoveInstanceResponse)
                                    return object;
                                return new $root.google.spanner.admin.instance.v1.MoveInstanceResponse();
                            };
    
                            /**
                             * Creates a plain object from a MoveInstanceResponse message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {google.spanner.admin.instance.v1.MoveInstanceResponse} message MoveInstanceResponse
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            MoveInstanceResponse.toObject = function toObject() {
                                return {};
                            };
    
                            /**
                             * Converts this MoveInstanceResponse to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            MoveInstanceResponse.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for MoveInstanceResponse
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceResponse
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            MoveInstanceResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.MoveInstanceResponse";
                            };
    
                            return MoveInstanceResponse;
                        })();
    
                        v1.MoveInstanceMetadata = (function() {
    
                            /**
                             * Properties of a MoveInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @interface IMoveInstanceMetadata
                             * @property {string|null} [targetConfig] MoveInstanceMetadata targetConfig
                             * @property {google.spanner.admin.instance.v1.IOperationProgress|null} [progress] MoveInstanceMetadata progress
                             * @property {google.protobuf.ITimestamp|null} [cancelTime] MoveInstanceMetadata cancelTime
                             */
    
                            /**
                             * Constructs a new MoveInstanceMetadata.
                             * @memberof google.spanner.admin.instance.v1
                             * @classdesc Represents a MoveInstanceMetadata.
                             * @implements IMoveInstanceMetadata
                             * @constructor
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceMetadata=} [properties] Properties to set
                             */
                            function MoveInstanceMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * MoveInstanceMetadata targetConfig.
                             * @member {string} targetConfig
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @instance
                             */
                            MoveInstanceMetadata.prototype.targetConfig = "";
    
                            /**
                             * MoveInstanceMetadata progress.
                             * @member {google.spanner.admin.instance.v1.IOperationProgress|null|undefined} progress
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @instance
                             */
                            MoveInstanceMetadata.prototype.progress = null;
    
                            /**
                             * MoveInstanceMetadata cancelTime.
                             * @member {google.protobuf.ITimestamp|null|undefined} cancelTime
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @instance
                             */
                            MoveInstanceMetadata.prototype.cancelTime = null;
    
                            /**
                             * Creates a new MoveInstanceMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceMetadata=} [properties] Properties to set
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceMetadata} MoveInstanceMetadata instance
                             */
                            MoveInstanceMetadata.create = function create(properties) {
                                return new MoveInstanceMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified MoveInstanceMetadata message. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceMetadata} message MoveInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.targetConfig != null && Object.hasOwnProperty.call(message, "targetConfig"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.targetConfig);
                                if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                                    $root.google.spanner.admin.instance.v1.OperationProgress.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.cancelTime != null && Object.hasOwnProperty.call(message, "cancelTime"))
                                    $root.google.protobuf.Timestamp.encode(message.cancelTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified MoveInstanceMetadata message, length delimited. Does not implicitly {@link google.spanner.admin.instance.v1.MoveInstanceMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.IMoveInstanceMetadata} message MoveInstanceMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInstanceMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a MoveInstanceMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceMetadata} MoveInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.admin.instance.v1.MoveInstanceMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.targetConfig = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.cancelTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a MoveInstanceMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceMetadata} MoveInstanceMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInstanceMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a MoveInstanceMetadata message.
                             * @function verify
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            MoveInstanceMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.targetConfig != null && message.hasOwnProperty("targetConfig"))
                                    if (!$util.isString(message.targetConfig))
                                        return "targetConfig: string expected";
                                if (message.progress != null && message.hasOwnProperty("progress")) {
                                    var error = $root.google.spanner.admin.instance.v1.OperationProgress.verify(message.progress);
                                    if (error)
                                        return "progress." + error;
                                }
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime")) {
                                    var error = $root.google.protobuf.Timestamp.verify(message.cancelTime);
                                    if (error)
                                        return "cancelTime." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a MoveInstanceMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.admin.instance.v1.MoveInstanceMetadata} MoveInstanceMetadata
                             */
                            MoveInstanceMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.admin.instance.v1.MoveInstanceMetadata)
                                    return object;
                                var message = new $root.google.spanner.admin.instance.v1.MoveInstanceMetadata();
                                if (object.targetConfig != null)
                                    message.targetConfig = String(object.targetConfig);
                                if (object.progress != null) {
                                    if (typeof object.progress !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.MoveInstanceMetadata.progress: object expected");
                                    message.progress = $root.google.spanner.admin.instance.v1.OperationProgress.fromObject(object.progress);
                                }
                                if (object.cancelTime != null) {
                                    if (typeof object.cancelTime !== "object")
                                        throw TypeError(".google.spanner.admin.instance.v1.MoveInstanceMetadata.cancelTime: object expected");
                                    message.cancelTime = $root.google.protobuf.Timestamp.fromObject(object.cancelTime);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a MoveInstanceMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {google.spanner.admin.instance.v1.MoveInstanceMetadata} message MoveInstanceMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            MoveInstanceMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.targetConfig = "";
                                    object.progress = null;
                                    object.cancelTime = null;
                                }
                                if (message.targetConfig != null && message.hasOwnProperty("targetConfig"))
                                    object.targetConfig = message.targetConfig;
                                if (message.progress != null && message.hasOwnProperty("progress"))
                                    object.progress = $root.google.spanner.admin.instance.v1.OperationProgress.toObject(message.progress, options);
                                if (message.cancelTime != null && message.hasOwnProperty("cancelTime"))
                                    object.cancelTime = $root.google.protobuf.Timestamp.toObject(message.cancelTime, options);
                                return object;
                            };
    
                            /**
                             * Converts this MoveInstanceMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            MoveInstanceMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for MoveInstanceMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.admin.instance.v1.MoveInstanceMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            MoveInstanceMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.admin.instance.v1.MoveInstanceMetadata";
                            };
    
                            return MoveInstanceMetadata;
                        })();
    
                        return v1;
                    })();
    
                    return instance;
                })();
    
                return admin;
            })();
    
            spanner.executor = (function() {
    
                /**
                 * Namespace executor.
                 * @memberof google.spanner
                 * @namespace
                 */
                var executor = {};
    
                executor.v1 = (function() {
    
                    /**
                     * Namespace v1.
                     * @memberof google.spanner.executor
                     * @namespace
                     */
                    var v1 = {};
    
                    v1.SpannerExecutorProxy = (function() {
    
                        /**
                         * Constructs a new SpannerExecutorProxy service.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerExecutorProxy
                         * @extends $protobuf.rpc.Service
                         * @constructor
                         * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                         * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                         * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                         */
                        function SpannerExecutorProxy(rpcImpl, requestDelimited, responseDelimited) {
                            $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                        }
    
                        (SpannerExecutorProxy.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = SpannerExecutorProxy;
    
                        /**
                         * Creates new SpannerExecutorProxy service using the specified rpc implementation.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerExecutorProxy
                         * @static
                         * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                         * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                         * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                         * @returns {SpannerExecutorProxy} RPC service. Useful where requests and/or responses are streamed.
                         */
                        SpannerExecutorProxy.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                            return new this(rpcImpl, requestDelimited, responseDelimited);
                        };
    
                        /**
                         * Callback as used by {@link google.spanner.executor.v1.SpannerExecutorProxy|executeActionAsync}.
                         * @memberof google.spanner.executor.v1.SpannerExecutorProxy
                         * @typedef ExecuteActionAsyncCallback
                         * @type {function}
                         * @param {Error|null} error Error, if any
                         * @param {google.spanner.executor.v1.SpannerAsyncActionResponse} [response] SpannerAsyncActionResponse
                         */
    
                        /**
                         * Calls ExecuteActionAsync.
                         * @function executeActionAsync
                         * @memberof google.spanner.executor.v1.SpannerExecutorProxy
                         * @instance
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest} request SpannerAsyncActionRequest message or plain object
                         * @param {google.spanner.executor.v1.SpannerExecutorProxy.ExecuteActionAsyncCallback} callback Node-style callback called with the error, if any, and SpannerAsyncActionResponse
                         * @returns {undefined}
                         * @variation 1
                         */
                        Object.defineProperty(SpannerExecutorProxy.prototype.executeActionAsync = function executeActionAsync(request, callback) {
                            return this.rpcCall(executeActionAsync, $root.google.spanner.executor.v1.SpannerAsyncActionRequest, $root.google.spanner.executor.v1.SpannerAsyncActionResponse, request, callback);
                        }, "name", { value: "ExecuteActionAsync" });
    
                        /**
                         * Calls ExecuteActionAsync.
                         * @function executeActionAsync
                         * @memberof google.spanner.executor.v1.SpannerExecutorProxy
                         * @instance
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest} request SpannerAsyncActionRequest message or plain object
                         * @returns {Promise<google.spanner.executor.v1.SpannerAsyncActionResponse>} Promise
                         * @variation 2
                         */
    
                        return SpannerExecutorProxy;
                    })();
    
                    v1.SpannerAsyncActionRequest = (function() {
    
                        /**
                         * Properties of a SpannerAsyncActionRequest.
                         * @memberof google.spanner.executor.v1
                         * @interface ISpannerAsyncActionRequest
                         * @property {number|null} [actionId] SpannerAsyncActionRequest actionId
                         * @property {google.spanner.executor.v1.ISpannerAction|null} [action] SpannerAsyncActionRequest action
                         */
    
                        /**
                         * Constructs a new SpannerAsyncActionRequest.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerAsyncActionRequest.
                         * @implements ISpannerAsyncActionRequest
                         * @constructor
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest=} [properties] Properties to set
                         */
                        function SpannerAsyncActionRequest(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SpannerAsyncActionRequest actionId.
                         * @member {number} actionId
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @instance
                         */
                        SpannerAsyncActionRequest.prototype.actionId = 0;
    
                        /**
                         * SpannerAsyncActionRequest action.
                         * @member {google.spanner.executor.v1.ISpannerAction|null|undefined} action
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @instance
                         */
                        SpannerAsyncActionRequest.prototype.action = null;
    
                        /**
                         * Creates a new SpannerAsyncActionRequest instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionRequest} SpannerAsyncActionRequest instance
                         */
                        SpannerAsyncActionRequest.create = function create(properties) {
                            return new SpannerAsyncActionRequest(properties);
                        };
    
                        /**
                         * Encodes the specified SpannerAsyncActionRequest message. Does not implicitly {@link google.spanner.executor.v1.SpannerAsyncActionRequest.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest} message SpannerAsyncActionRequest message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAsyncActionRequest.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.actionId != null && Object.hasOwnProperty.call(message, "actionId"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.actionId);
                            if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                                $root.google.spanner.executor.v1.SpannerAction.encode(message.action, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SpannerAsyncActionRequest message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SpannerAsyncActionRequest.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionRequest} message SpannerAsyncActionRequest message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAsyncActionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SpannerAsyncActionRequest message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionRequest} SpannerAsyncActionRequest
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAsyncActionRequest.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SpannerAsyncActionRequest();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.actionId = reader.int32();
                                        break;
                                    }
                                case 2: {
                                        message.action = $root.google.spanner.executor.v1.SpannerAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SpannerAsyncActionRequest message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionRequest} SpannerAsyncActionRequest
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAsyncActionRequest.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SpannerAsyncActionRequest message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SpannerAsyncActionRequest.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.actionId != null && message.hasOwnProperty("actionId"))
                                if (!$util.isInteger(message.actionId))
                                    return "actionId: integer expected";
                            if (message.action != null && message.hasOwnProperty("action")) {
                                var error = $root.google.spanner.executor.v1.SpannerAction.verify(message.action);
                                if (error)
                                    return "action." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a SpannerAsyncActionRequest message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionRequest} SpannerAsyncActionRequest
                         */
                        SpannerAsyncActionRequest.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SpannerAsyncActionRequest)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SpannerAsyncActionRequest();
                            if (object.actionId != null)
                                message.actionId = object.actionId | 0;
                            if (object.action != null) {
                                if (typeof object.action !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAsyncActionRequest.action: object expected");
                                message.action = $root.google.spanner.executor.v1.SpannerAction.fromObject(object.action);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SpannerAsyncActionRequest message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {google.spanner.executor.v1.SpannerAsyncActionRequest} message SpannerAsyncActionRequest
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SpannerAsyncActionRequest.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.actionId = 0;
                                object.action = null;
                            }
                            if (message.actionId != null && message.hasOwnProperty("actionId"))
                                object.actionId = message.actionId;
                            if (message.action != null && message.hasOwnProperty("action"))
                                object.action = $root.google.spanner.executor.v1.SpannerAction.toObject(message.action, options);
                            return object;
                        };
    
                        /**
                         * Converts this SpannerAsyncActionRequest to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SpannerAsyncActionRequest.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SpannerAsyncActionRequest
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionRequest
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SpannerAsyncActionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SpannerAsyncActionRequest";
                        };
    
                        return SpannerAsyncActionRequest;
                    })();
    
                    v1.SpannerAsyncActionResponse = (function() {
    
                        /**
                         * Properties of a SpannerAsyncActionResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface ISpannerAsyncActionResponse
                         * @property {number|null} [actionId] SpannerAsyncActionResponse actionId
                         * @property {google.spanner.executor.v1.ISpannerActionOutcome|null} [outcome] SpannerAsyncActionResponse outcome
                         */
    
                        /**
                         * Constructs a new SpannerAsyncActionResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerAsyncActionResponse.
                         * @implements ISpannerAsyncActionResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionResponse=} [properties] Properties to set
                         */
                        function SpannerAsyncActionResponse(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SpannerAsyncActionResponse actionId.
                         * @member {number} actionId
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @instance
                         */
                        SpannerAsyncActionResponse.prototype.actionId = 0;
    
                        /**
                         * SpannerAsyncActionResponse outcome.
                         * @member {google.spanner.executor.v1.ISpannerActionOutcome|null|undefined} outcome
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @instance
                         */
                        SpannerAsyncActionResponse.prototype.outcome = null;
    
                        /**
                         * Creates a new SpannerAsyncActionResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionResponse} SpannerAsyncActionResponse instance
                         */
                        SpannerAsyncActionResponse.create = function create(properties) {
                            return new SpannerAsyncActionResponse(properties);
                        };
    
                        /**
                         * Encodes the specified SpannerAsyncActionResponse message. Does not implicitly {@link google.spanner.executor.v1.SpannerAsyncActionResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionResponse} message SpannerAsyncActionResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAsyncActionResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.actionId != null && Object.hasOwnProperty.call(message, "actionId"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.actionId);
                            if (message.outcome != null && Object.hasOwnProperty.call(message, "outcome"))
                                $root.google.spanner.executor.v1.SpannerActionOutcome.encode(message.outcome, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SpannerAsyncActionResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SpannerAsyncActionResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAsyncActionResponse} message SpannerAsyncActionResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAsyncActionResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SpannerAsyncActionResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionResponse} SpannerAsyncActionResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAsyncActionResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SpannerAsyncActionResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.actionId = reader.int32();
                                        break;
                                    }
                                case 2: {
                                        message.outcome = $root.google.spanner.executor.v1.SpannerActionOutcome.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SpannerAsyncActionResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionResponse} SpannerAsyncActionResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAsyncActionResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SpannerAsyncActionResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SpannerAsyncActionResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.actionId != null && message.hasOwnProperty("actionId"))
                                if (!$util.isInteger(message.actionId))
                                    return "actionId: integer expected";
                            if (message.outcome != null && message.hasOwnProperty("outcome")) {
                                var error = $root.google.spanner.executor.v1.SpannerActionOutcome.verify(message.outcome);
                                if (error)
                                    return "outcome." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a SpannerAsyncActionResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SpannerAsyncActionResponse} SpannerAsyncActionResponse
                         */
                        SpannerAsyncActionResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SpannerAsyncActionResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SpannerAsyncActionResponse();
                            if (object.actionId != null)
                                message.actionId = object.actionId | 0;
                            if (object.outcome != null) {
                                if (typeof object.outcome !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAsyncActionResponse.outcome: object expected");
                                message.outcome = $root.google.spanner.executor.v1.SpannerActionOutcome.fromObject(object.outcome);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SpannerAsyncActionResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {google.spanner.executor.v1.SpannerAsyncActionResponse} message SpannerAsyncActionResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SpannerAsyncActionResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.actionId = 0;
                                object.outcome = null;
                            }
                            if (message.actionId != null && message.hasOwnProperty("actionId"))
                                object.actionId = message.actionId;
                            if (message.outcome != null && message.hasOwnProperty("outcome"))
                                object.outcome = $root.google.spanner.executor.v1.SpannerActionOutcome.toObject(message.outcome, options);
                            return object;
                        };
    
                        /**
                         * Converts this SpannerAsyncActionResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SpannerAsyncActionResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SpannerAsyncActionResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SpannerAsyncActionResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SpannerAsyncActionResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SpannerAsyncActionResponse";
                        };
    
                        return SpannerAsyncActionResponse;
                    })();
    
                    v1.SpannerAction = (function() {
    
                        /**
                         * Properties of a SpannerAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ISpannerAction
                         * @property {string|null} [databasePath] SpannerAction databasePath
                         * @property {google.spanner.executor.v1.ISpannerOptions|null} [spannerOptions] SpannerAction spannerOptions
                         * @property {google.spanner.executor.v1.IStartTransactionAction|null} [start] SpannerAction start
                         * @property {google.spanner.executor.v1.IFinishTransactionAction|null} [finish] SpannerAction finish
                         * @property {google.spanner.executor.v1.IReadAction|null} [read] SpannerAction read
                         * @property {google.spanner.executor.v1.IQueryAction|null} [query] SpannerAction query
                         * @property {google.spanner.executor.v1.IMutationAction|null} [mutation] SpannerAction mutation
                         * @property {google.spanner.executor.v1.IDmlAction|null} [dml] SpannerAction dml
                         * @property {google.spanner.executor.v1.IBatchDmlAction|null} [batchDml] SpannerAction batchDml
                         * @property {google.spanner.executor.v1.IWriteMutationsAction|null} [write] SpannerAction write
                         * @property {google.spanner.executor.v1.IPartitionedUpdateAction|null} [partitionedUpdate] SpannerAction partitionedUpdate
                         * @property {google.spanner.executor.v1.IAdminAction|null} [admin] SpannerAction admin
                         * @property {google.spanner.executor.v1.IStartBatchTransactionAction|null} [startBatchTxn] SpannerAction startBatchTxn
                         * @property {google.spanner.executor.v1.ICloseBatchTransactionAction|null} [closeBatchTxn] SpannerAction closeBatchTxn
                         * @property {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction|null} [generateDbPartitionsRead] SpannerAction generateDbPartitionsRead
                         * @property {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction|null} [generateDbPartitionsQuery] SpannerAction generateDbPartitionsQuery
                         * @property {google.spanner.executor.v1.IExecutePartitionAction|null} [executePartition] SpannerAction executePartition
                         * @property {google.spanner.executor.v1.IExecuteChangeStreamQuery|null} [executeChangeStreamQuery] SpannerAction executeChangeStreamQuery
                         * @property {google.spanner.executor.v1.IQueryCancellationAction|null} [queryCancellation] SpannerAction queryCancellation
                         */
    
                        /**
                         * Constructs a new SpannerAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerAction.
                         * @implements ISpannerAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ISpannerAction=} [properties] Properties to set
                         */
                        function SpannerAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SpannerAction databasePath.
                         * @member {string} databasePath
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.databasePath = "";
    
                        /**
                         * SpannerAction spannerOptions.
                         * @member {google.spanner.executor.v1.ISpannerOptions|null|undefined} spannerOptions
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.spannerOptions = null;
    
                        /**
                         * SpannerAction start.
                         * @member {google.spanner.executor.v1.IStartTransactionAction|null|undefined} start
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.start = null;
    
                        /**
                         * SpannerAction finish.
                         * @member {google.spanner.executor.v1.IFinishTransactionAction|null|undefined} finish
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.finish = null;
    
                        /**
                         * SpannerAction read.
                         * @member {google.spanner.executor.v1.IReadAction|null|undefined} read
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.read = null;
    
                        /**
                         * SpannerAction query.
                         * @member {google.spanner.executor.v1.IQueryAction|null|undefined} query
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.query = null;
    
                        /**
                         * SpannerAction mutation.
                         * @member {google.spanner.executor.v1.IMutationAction|null|undefined} mutation
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.mutation = null;
    
                        /**
                         * SpannerAction dml.
                         * @member {google.spanner.executor.v1.IDmlAction|null|undefined} dml
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.dml = null;
    
                        /**
                         * SpannerAction batchDml.
                         * @member {google.spanner.executor.v1.IBatchDmlAction|null|undefined} batchDml
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.batchDml = null;
    
                        /**
                         * SpannerAction write.
                         * @member {google.spanner.executor.v1.IWriteMutationsAction|null|undefined} write
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.write = null;
    
                        /**
                         * SpannerAction partitionedUpdate.
                         * @member {google.spanner.executor.v1.IPartitionedUpdateAction|null|undefined} partitionedUpdate
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.partitionedUpdate = null;
    
                        /**
                         * SpannerAction admin.
                         * @member {google.spanner.executor.v1.IAdminAction|null|undefined} admin
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.admin = null;
    
                        /**
                         * SpannerAction startBatchTxn.
                         * @member {google.spanner.executor.v1.IStartBatchTransactionAction|null|undefined} startBatchTxn
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.startBatchTxn = null;
    
                        /**
                         * SpannerAction closeBatchTxn.
                         * @member {google.spanner.executor.v1.ICloseBatchTransactionAction|null|undefined} closeBatchTxn
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.closeBatchTxn = null;
    
                        /**
                         * SpannerAction generateDbPartitionsRead.
                         * @member {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction|null|undefined} generateDbPartitionsRead
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.generateDbPartitionsRead = null;
    
                        /**
                         * SpannerAction generateDbPartitionsQuery.
                         * @member {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction|null|undefined} generateDbPartitionsQuery
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.generateDbPartitionsQuery = null;
    
                        /**
                         * SpannerAction executePartition.
                         * @member {google.spanner.executor.v1.IExecutePartitionAction|null|undefined} executePartition
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.executePartition = null;
    
                        /**
                         * SpannerAction executeChangeStreamQuery.
                         * @member {google.spanner.executor.v1.IExecuteChangeStreamQuery|null|undefined} executeChangeStreamQuery
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.executeChangeStreamQuery = null;
    
                        /**
                         * SpannerAction queryCancellation.
                         * @member {google.spanner.executor.v1.IQueryCancellationAction|null|undefined} queryCancellation
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        SpannerAction.prototype.queryCancellation = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * SpannerAction action.
                         * @member {"start"|"finish"|"read"|"query"|"mutation"|"dml"|"batchDml"|"write"|"partitionedUpdate"|"admin"|"startBatchTxn"|"closeBatchTxn"|"generateDbPartitionsRead"|"generateDbPartitionsQuery"|"executePartition"|"executeChangeStreamQuery"|"queryCancellation"|undefined} action
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         */
                        Object.defineProperty(SpannerAction.prototype, "action", {
                            get: $util.oneOfGetter($oneOfFields = ["start", "finish", "read", "query", "mutation", "dml", "batchDml", "write", "partitionedUpdate", "admin", "startBatchTxn", "closeBatchTxn", "generateDbPartitionsRead", "generateDbPartitionsQuery", "executePartition", "executeChangeStreamQuery", "queryCancellation"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new SpannerAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SpannerAction} SpannerAction instance
                         */
                        SpannerAction.create = function create(properties) {
                            return new SpannerAction(properties);
                        };
    
                        /**
                         * Encodes the specified SpannerAction message. Does not implicitly {@link google.spanner.executor.v1.SpannerAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAction} message SpannerAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.databasePath != null && Object.hasOwnProperty.call(message, "databasePath"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.databasePath);
                            if (message.spannerOptions != null && Object.hasOwnProperty.call(message, "spannerOptions"))
                                $root.google.spanner.executor.v1.SpannerOptions.encode(message.spannerOptions, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                                $root.google.spanner.executor.v1.StartTransactionAction.encode(message.start, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                            if (message.finish != null && Object.hasOwnProperty.call(message, "finish"))
                                $root.google.spanner.executor.v1.FinishTransactionAction.encode(message.finish, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                            if (message.read != null && Object.hasOwnProperty.call(message, "read"))
                                $root.google.spanner.executor.v1.ReadAction.encode(message.read, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim();
                            if (message.query != null && Object.hasOwnProperty.call(message, "query"))
                                $root.google.spanner.executor.v1.QueryAction.encode(message.query, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim();
                            if (message.mutation != null && Object.hasOwnProperty.call(message, "mutation"))
                                $root.google.spanner.executor.v1.MutationAction.encode(message.mutation, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();
                            if (message.dml != null && Object.hasOwnProperty.call(message, "dml"))
                                $root.google.spanner.executor.v1.DmlAction.encode(message.dml, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();
                            if (message.batchDml != null && Object.hasOwnProperty.call(message, "batchDml"))
                                $root.google.spanner.executor.v1.BatchDmlAction.encode(message.batchDml, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim();
                            if (message.write != null && Object.hasOwnProperty.call(message, "write"))
                                $root.google.spanner.executor.v1.WriteMutationsAction.encode(message.write, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim();
                            if (message.partitionedUpdate != null && Object.hasOwnProperty.call(message, "partitionedUpdate"))
                                $root.google.spanner.executor.v1.PartitionedUpdateAction.encode(message.partitionedUpdate, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim();
                            if (message.admin != null && Object.hasOwnProperty.call(message, "admin"))
                                $root.google.spanner.executor.v1.AdminAction.encode(message.admin, writer.uint32(/* id 30, wireType 2 =*/242).fork()).ldelim();
                            if (message.startBatchTxn != null && Object.hasOwnProperty.call(message, "startBatchTxn"))
                                $root.google.spanner.executor.v1.StartBatchTransactionAction.encode(message.startBatchTxn, writer.uint32(/* id 40, wireType 2 =*/322).fork()).ldelim();
                            if (message.closeBatchTxn != null && Object.hasOwnProperty.call(message, "closeBatchTxn"))
                                $root.google.spanner.executor.v1.CloseBatchTransactionAction.encode(message.closeBatchTxn, writer.uint32(/* id 41, wireType 2 =*/330).fork()).ldelim();
                            if (message.generateDbPartitionsRead != null && Object.hasOwnProperty.call(message, "generateDbPartitionsRead"))
                                $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction.encode(message.generateDbPartitionsRead, writer.uint32(/* id 42, wireType 2 =*/338).fork()).ldelim();
                            if (message.generateDbPartitionsQuery != null && Object.hasOwnProperty.call(message, "generateDbPartitionsQuery"))
                                $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.encode(message.generateDbPartitionsQuery, writer.uint32(/* id 43, wireType 2 =*/346).fork()).ldelim();
                            if (message.executePartition != null && Object.hasOwnProperty.call(message, "executePartition"))
                                $root.google.spanner.executor.v1.ExecutePartitionAction.encode(message.executePartition, writer.uint32(/* id 44, wireType 2 =*/354).fork()).ldelim();
                            if (message.executeChangeStreamQuery != null && Object.hasOwnProperty.call(message, "executeChangeStreamQuery"))
                                $root.google.spanner.executor.v1.ExecuteChangeStreamQuery.encode(message.executeChangeStreamQuery, writer.uint32(/* id 50, wireType 2 =*/402).fork()).ldelim();
                            if (message.queryCancellation != null && Object.hasOwnProperty.call(message, "queryCancellation"))
                                $root.google.spanner.executor.v1.QueryCancellationAction.encode(message.queryCancellation, writer.uint32(/* id 51, wireType 2 =*/410).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SpannerAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SpannerAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerAction} message SpannerAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SpannerAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SpannerAction} SpannerAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SpannerAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.databasePath = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.spannerOptions = $root.google.spanner.executor.v1.SpannerOptions.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 10: {
                                        message.start = $root.google.spanner.executor.v1.StartTransactionAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 11: {
                                        message.finish = $root.google.spanner.executor.v1.FinishTransactionAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 20: {
                                        message.read = $root.google.spanner.executor.v1.ReadAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 21: {
                                        message.query = $root.google.spanner.executor.v1.QueryAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 22: {
                                        message.mutation = $root.google.spanner.executor.v1.MutationAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 23: {
                                        message.dml = $root.google.spanner.executor.v1.DmlAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 24: {
                                        message.batchDml = $root.google.spanner.executor.v1.BatchDmlAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 25: {
                                        message.write = $root.google.spanner.executor.v1.WriteMutationsAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 27: {
                                        message.partitionedUpdate = $root.google.spanner.executor.v1.PartitionedUpdateAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 30: {
                                        message.admin = $root.google.spanner.executor.v1.AdminAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 40: {
                                        message.startBatchTxn = $root.google.spanner.executor.v1.StartBatchTransactionAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 41: {
                                        message.closeBatchTxn = $root.google.spanner.executor.v1.CloseBatchTransactionAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 42: {
                                        message.generateDbPartitionsRead = $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 43: {
                                        message.generateDbPartitionsQuery = $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 44: {
                                        message.executePartition = $root.google.spanner.executor.v1.ExecutePartitionAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 50: {
                                        message.executeChangeStreamQuery = $root.google.spanner.executor.v1.ExecuteChangeStreamQuery.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 51: {
                                        message.queryCancellation = $root.google.spanner.executor.v1.QueryCancellationAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SpannerAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SpannerAction} SpannerAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SpannerAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SpannerAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.databasePath != null && message.hasOwnProperty("databasePath"))
                                if (!$util.isString(message.databasePath))
                                    return "databasePath: string expected";
                            if (message.spannerOptions != null && message.hasOwnProperty("spannerOptions")) {
                                var error = $root.google.spanner.executor.v1.SpannerOptions.verify(message.spannerOptions);
                                if (error)
                                    return "spannerOptions." + error;
                            }
                            if (message.start != null && message.hasOwnProperty("start")) {
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.StartTransactionAction.verify(message.start);
                                    if (error)
                                        return "start." + error;
                                }
                            }
                            if (message.finish != null && message.hasOwnProperty("finish")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.FinishTransactionAction.verify(message.finish);
                                    if (error)
                                        return "finish." + error;
                                }
                            }
                            if (message.read != null && message.hasOwnProperty("read")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ReadAction.verify(message.read);
                                    if (error)
                                        return "read." + error;
                                }
                            }
                            if (message.query != null && message.hasOwnProperty("query")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.QueryAction.verify(message.query);
                                    if (error)
                                        return "query." + error;
                                }
                            }
                            if (message.mutation != null && message.hasOwnProperty("mutation")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.MutationAction.verify(message.mutation);
                                    if (error)
                                        return "mutation." + error;
                                }
                            }
                            if (message.dml != null && message.hasOwnProperty("dml")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DmlAction.verify(message.dml);
                                    if (error)
                                        return "dml." + error;
                                }
                            }
                            if (message.batchDml != null && message.hasOwnProperty("batchDml")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.BatchDmlAction.verify(message.batchDml);
                                    if (error)
                                        return "batchDml." + error;
                                }
                            }
                            if (message.write != null && message.hasOwnProperty("write")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.WriteMutationsAction.verify(message.write);
                                    if (error)
                                        return "write." + error;
                                }
                            }
                            if (message.partitionedUpdate != null && message.hasOwnProperty("partitionedUpdate")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.PartitionedUpdateAction.verify(message.partitionedUpdate);
                                    if (error)
                                        return "partitionedUpdate." + error;
                                }
                            }
                            if (message.admin != null && message.hasOwnProperty("admin")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.AdminAction.verify(message.admin);
                                    if (error)
                                        return "admin." + error;
                                }
                            }
                            if (message.startBatchTxn != null && message.hasOwnProperty("startBatchTxn")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.StartBatchTransactionAction.verify(message.startBatchTxn);
                                    if (error)
                                        return "startBatchTxn." + error;
                                }
                            }
                            if (message.closeBatchTxn != null && message.hasOwnProperty("closeBatchTxn")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CloseBatchTransactionAction.verify(message.closeBatchTxn);
                                    if (error)
                                        return "closeBatchTxn." + error;
                                }
                            }
                            if (message.generateDbPartitionsRead != null && message.hasOwnProperty("generateDbPartitionsRead")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction.verify(message.generateDbPartitionsRead);
                                    if (error)
                                        return "generateDbPartitionsRead." + error;
                                }
                            }
                            if (message.generateDbPartitionsQuery != null && message.hasOwnProperty("generateDbPartitionsQuery")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.verify(message.generateDbPartitionsQuery);
                                    if (error)
                                        return "generateDbPartitionsQuery." + error;
                                }
                            }
                            if (message.executePartition != null && message.hasOwnProperty("executePartition")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ExecutePartitionAction.verify(message.executePartition);
                                    if (error)
                                        return "executePartition." + error;
                                }
                            }
                            if (message.executeChangeStreamQuery != null && message.hasOwnProperty("executeChangeStreamQuery")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ExecuteChangeStreamQuery.verify(message.executeChangeStreamQuery);
                                    if (error)
                                        return "executeChangeStreamQuery." + error;
                                }
                            }
                            if (message.queryCancellation != null && message.hasOwnProperty("queryCancellation")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.QueryCancellationAction.verify(message.queryCancellation);
                                    if (error)
                                        return "queryCancellation." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a SpannerAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SpannerAction} SpannerAction
                         */
                        SpannerAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SpannerAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SpannerAction();
                            if (object.databasePath != null)
                                message.databasePath = String(object.databasePath);
                            if (object.spannerOptions != null) {
                                if (typeof object.spannerOptions !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.spannerOptions: object expected");
                                message.spannerOptions = $root.google.spanner.executor.v1.SpannerOptions.fromObject(object.spannerOptions);
                            }
                            if (object.start != null) {
                                if (typeof object.start !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.start: object expected");
                                message.start = $root.google.spanner.executor.v1.StartTransactionAction.fromObject(object.start);
                            }
                            if (object.finish != null) {
                                if (typeof object.finish !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.finish: object expected");
                                message.finish = $root.google.spanner.executor.v1.FinishTransactionAction.fromObject(object.finish);
                            }
                            if (object.read != null) {
                                if (typeof object.read !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.read: object expected");
                                message.read = $root.google.spanner.executor.v1.ReadAction.fromObject(object.read);
                            }
                            if (object.query != null) {
                                if (typeof object.query !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.query: object expected");
                                message.query = $root.google.spanner.executor.v1.QueryAction.fromObject(object.query);
                            }
                            if (object.mutation != null) {
                                if (typeof object.mutation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.mutation: object expected");
                                message.mutation = $root.google.spanner.executor.v1.MutationAction.fromObject(object.mutation);
                            }
                            if (object.dml != null) {
                                if (typeof object.dml !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.dml: object expected");
                                message.dml = $root.google.spanner.executor.v1.DmlAction.fromObject(object.dml);
                            }
                            if (object.batchDml != null) {
                                if (typeof object.batchDml !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.batchDml: object expected");
                                message.batchDml = $root.google.spanner.executor.v1.BatchDmlAction.fromObject(object.batchDml);
                            }
                            if (object.write != null) {
                                if (typeof object.write !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.write: object expected");
                                message.write = $root.google.spanner.executor.v1.WriteMutationsAction.fromObject(object.write);
                            }
                            if (object.partitionedUpdate != null) {
                                if (typeof object.partitionedUpdate !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.partitionedUpdate: object expected");
                                message.partitionedUpdate = $root.google.spanner.executor.v1.PartitionedUpdateAction.fromObject(object.partitionedUpdate);
                            }
                            if (object.admin != null) {
                                if (typeof object.admin !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.admin: object expected");
                                message.admin = $root.google.spanner.executor.v1.AdminAction.fromObject(object.admin);
                            }
                            if (object.startBatchTxn != null) {
                                if (typeof object.startBatchTxn !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.startBatchTxn: object expected");
                                message.startBatchTxn = $root.google.spanner.executor.v1.StartBatchTransactionAction.fromObject(object.startBatchTxn);
                            }
                            if (object.closeBatchTxn != null) {
                                if (typeof object.closeBatchTxn !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.closeBatchTxn: object expected");
                                message.closeBatchTxn = $root.google.spanner.executor.v1.CloseBatchTransactionAction.fromObject(object.closeBatchTxn);
                            }
                            if (object.generateDbPartitionsRead != null) {
                                if (typeof object.generateDbPartitionsRead !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.generateDbPartitionsRead: object expected");
                                message.generateDbPartitionsRead = $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction.fromObject(object.generateDbPartitionsRead);
                            }
                            if (object.generateDbPartitionsQuery != null) {
                                if (typeof object.generateDbPartitionsQuery !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.generateDbPartitionsQuery: object expected");
                                message.generateDbPartitionsQuery = $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.fromObject(object.generateDbPartitionsQuery);
                            }
                            if (object.executePartition != null) {
                                if (typeof object.executePartition !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.executePartition: object expected");
                                message.executePartition = $root.google.spanner.executor.v1.ExecutePartitionAction.fromObject(object.executePartition);
                            }
                            if (object.executeChangeStreamQuery != null) {
                                if (typeof object.executeChangeStreamQuery !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.executeChangeStreamQuery: object expected");
                                message.executeChangeStreamQuery = $root.google.spanner.executor.v1.ExecuteChangeStreamQuery.fromObject(object.executeChangeStreamQuery);
                            }
                            if (object.queryCancellation != null) {
                                if (typeof object.queryCancellation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerAction.queryCancellation: object expected");
                                message.queryCancellation = $root.google.spanner.executor.v1.QueryCancellationAction.fromObject(object.queryCancellation);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SpannerAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {google.spanner.executor.v1.SpannerAction} message SpannerAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SpannerAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.databasePath = "";
                                object.spannerOptions = null;
                            }
                            if (message.databasePath != null && message.hasOwnProperty("databasePath"))
                                object.databasePath = message.databasePath;
                            if (message.spannerOptions != null && message.hasOwnProperty("spannerOptions"))
                                object.spannerOptions = $root.google.spanner.executor.v1.SpannerOptions.toObject(message.spannerOptions, options);
                            if (message.start != null && message.hasOwnProperty("start")) {
                                object.start = $root.google.spanner.executor.v1.StartTransactionAction.toObject(message.start, options);
                                if (options.oneofs)
                                    object.action = "start";
                            }
                            if (message.finish != null && message.hasOwnProperty("finish")) {
                                object.finish = $root.google.spanner.executor.v1.FinishTransactionAction.toObject(message.finish, options);
                                if (options.oneofs)
                                    object.action = "finish";
                            }
                            if (message.read != null && message.hasOwnProperty("read")) {
                                object.read = $root.google.spanner.executor.v1.ReadAction.toObject(message.read, options);
                                if (options.oneofs)
                                    object.action = "read";
                            }
                            if (message.query != null && message.hasOwnProperty("query")) {
                                object.query = $root.google.spanner.executor.v1.QueryAction.toObject(message.query, options);
                                if (options.oneofs)
                                    object.action = "query";
                            }
                            if (message.mutation != null && message.hasOwnProperty("mutation")) {
                                object.mutation = $root.google.spanner.executor.v1.MutationAction.toObject(message.mutation, options);
                                if (options.oneofs)
                                    object.action = "mutation";
                            }
                            if (message.dml != null && message.hasOwnProperty("dml")) {
                                object.dml = $root.google.spanner.executor.v1.DmlAction.toObject(message.dml, options);
                                if (options.oneofs)
                                    object.action = "dml";
                            }
                            if (message.batchDml != null && message.hasOwnProperty("batchDml")) {
                                object.batchDml = $root.google.spanner.executor.v1.BatchDmlAction.toObject(message.batchDml, options);
                                if (options.oneofs)
                                    object.action = "batchDml";
                            }
                            if (message.write != null && message.hasOwnProperty("write")) {
                                object.write = $root.google.spanner.executor.v1.WriteMutationsAction.toObject(message.write, options);
                                if (options.oneofs)
                                    object.action = "write";
                            }
                            if (message.partitionedUpdate != null && message.hasOwnProperty("partitionedUpdate")) {
                                object.partitionedUpdate = $root.google.spanner.executor.v1.PartitionedUpdateAction.toObject(message.partitionedUpdate, options);
                                if (options.oneofs)
                                    object.action = "partitionedUpdate";
                            }
                            if (message.admin != null && message.hasOwnProperty("admin")) {
                                object.admin = $root.google.spanner.executor.v1.AdminAction.toObject(message.admin, options);
                                if (options.oneofs)
                                    object.action = "admin";
                            }
                            if (message.startBatchTxn != null && message.hasOwnProperty("startBatchTxn")) {
                                object.startBatchTxn = $root.google.spanner.executor.v1.StartBatchTransactionAction.toObject(message.startBatchTxn, options);
                                if (options.oneofs)
                                    object.action = "startBatchTxn";
                            }
                            if (message.closeBatchTxn != null && message.hasOwnProperty("closeBatchTxn")) {
                                object.closeBatchTxn = $root.google.spanner.executor.v1.CloseBatchTransactionAction.toObject(message.closeBatchTxn, options);
                                if (options.oneofs)
                                    object.action = "closeBatchTxn";
                            }
                            if (message.generateDbPartitionsRead != null && message.hasOwnProperty("generateDbPartitionsRead")) {
                                object.generateDbPartitionsRead = $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction.toObject(message.generateDbPartitionsRead, options);
                                if (options.oneofs)
                                    object.action = "generateDbPartitionsRead";
                            }
                            if (message.generateDbPartitionsQuery != null && message.hasOwnProperty("generateDbPartitionsQuery")) {
                                object.generateDbPartitionsQuery = $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.toObject(message.generateDbPartitionsQuery, options);
                                if (options.oneofs)
                                    object.action = "generateDbPartitionsQuery";
                            }
                            if (message.executePartition != null && message.hasOwnProperty("executePartition")) {
                                object.executePartition = $root.google.spanner.executor.v1.ExecutePartitionAction.toObject(message.executePartition, options);
                                if (options.oneofs)
                                    object.action = "executePartition";
                            }
                            if (message.executeChangeStreamQuery != null && message.hasOwnProperty("executeChangeStreamQuery")) {
                                object.executeChangeStreamQuery = $root.google.spanner.executor.v1.ExecuteChangeStreamQuery.toObject(message.executeChangeStreamQuery, options);
                                if (options.oneofs)
                                    object.action = "executeChangeStreamQuery";
                            }
                            if (message.queryCancellation != null && message.hasOwnProperty("queryCancellation")) {
                                object.queryCancellation = $root.google.spanner.executor.v1.QueryCancellationAction.toObject(message.queryCancellation, options);
                                if (options.oneofs)
                                    object.action = "queryCancellation";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this SpannerAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SpannerAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SpannerAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SpannerAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SpannerAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SpannerAction";
                        };
    
                        return SpannerAction;
                    })();
    
                    v1.ReadAction = (function() {
    
                        /**
                         * Properties of a ReadAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IReadAction
                         * @property {string|null} [table] ReadAction table
                         * @property {string|null} [index] ReadAction index
                         * @property {Array.<string>|null} [column] ReadAction column
                         * @property {google.spanner.executor.v1.IKeySet|null} [keys] ReadAction keys
                         * @property {number|null} [limit] ReadAction limit
                         */
    
                        /**
                         * Constructs a new ReadAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ReadAction.
                         * @implements IReadAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IReadAction=} [properties] Properties to set
                         */
                        function ReadAction(properties) {
                            this.column = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ReadAction table.
                         * @member {string} table
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         */
                        ReadAction.prototype.table = "";
    
                        /**
                         * ReadAction index.
                         * @member {string|null|undefined} index
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         */
                        ReadAction.prototype.index = null;
    
                        /**
                         * ReadAction column.
                         * @member {Array.<string>} column
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         */
                        ReadAction.prototype.column = $util.emptyArray;
    
                        /**
                         * ReadAction keys.
                         * @member {google.spanner.executor.v1.IKeySet|null|undefined} keys
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         */
                        ReadAction.prototype.keys = null;
    
                        /**
                         * ReadAction limit.
                         * @member {number} limit
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         */
                        ReadAction.prototype.limit = 0;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ReadAction.prototype, "_index", {
                            get: $util.oneOfGetter($oneOfFields = ["index"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ReadAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IReadAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ReadAction} ReadAction instance
                         */
                        ReadAction.create = function create(properties) {
                            return new ReadAction(properties);
                        };
    
                        /**
                         * Encodes the specified ReadAction message. Does not implicitly {@link google.spanner.executor.v1.ReadAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IReadAction} message ReadAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                            if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.index);
                            if (message.column != null && message.column.length)
                                for (var i = 0; i < message.column.length; ++i)
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.column[i]);
                            if (message.keys != null && Object.hasOwnProperty.call(message, "keys"))
                                $root.google.spanner.executor.v1.KeySet.encode(message.keys, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.limit != null && Object.hasOwnProperty.call(message, "limit"))
                                writer.uint32(/* id 5, wireType 0 =*/40).int32(message.limit);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ReadAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ReadAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IReadAction} message ReadAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ReadAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ReadAction} ReadAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ReadAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.index = reader.string();
                                        break;
                                    }
                                case 3: {
                                        if (!(message.column && message.column.length))
                                            message.column = [];
                                        message.column.push(reader.string());
                                        break;
                                    }
                                case 4: {
                                        message.keys = $root.google.spanner.executor.v1.KeySet.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        message.limit = reader.int32();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ReadAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ReadAction} ReadAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ReadAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ReadAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.index != null && message.hasOwnProperty("index")) {
                                properties._index = 1;
                                if (!$util.isString(message.index))
                                    return "index: string expected";
                            }
                            if (message.column != null && message.hasOwnProperty("column")) {
                                if (!Array.isArray(message.column))
                                    return "column: array expected";
                                for (var i = 0; i < message.column.length; ++i)
                                    if (!$util.isString(message.column[i]))
                                        return "column: string[] expected";
                            }
                            if (message.keys != null && message.hasOwnProperty("keys")) {
                                var error = $root.google.spanner.executor.v1.KeySet.verify(message.keys);
                                if (error)
                                    return "keys." + error;
                            }
                            if (message.limit != null && message.hasOwnProperty("limit"))
                                if (!$util.isInteger(message.limit))
                                    return "limit: integer expected";
                            return null;
                        };
    
                        /**
                         * Creates a ReadAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ReadAction} ReadAction
                         */
                        ReadAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ReadAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ReadAction();
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.index != null)
                                message.index = String(object.index);
                            if (object.column) {
                                if (!Array.isArray(object.column))
                                    throw TypeError(".google.spanner.executor.v1.ReadAction.column: array expected");
                                message.column = [];
                                for (var i = 0; i < object.column.length; ++i)
                                    message.column[i] = String(object.column[i]);
                            }
                            if (object.keys != null) {
                                if (typeof object.keys !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ReadAction.keys: object expected");
                                message.keys = $root.google.spanner.executor.v1.KeySet.fromObject(object.keys);
                            }
                            if (object.limit != null)
                                message.limit = object.limit | 0;
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ReadAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {google.spanner.executor.v1.ReadAction} message ReadAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ReadAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.column = [];
                            if (options.defaults) {
                                object.table = "";
                                object.keys = null;
                                object.limit = 0;
                            }
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.index != null && message.hasOwnProperty("index")) {
                                object.index = message.index;
                                if (options.oneofs)
                                    object._index = "index";
                            }
                            if (message.column && message.column.length) {
                                object.column = [];
                                for (var j = 0; j < message.column.length; ++j)
                                    object.column[j] = message.column[j];
                            }
                            if (message.keys != null && message.hasOwnProperty("keys"))
                                object.keys = $root.google.spanner.executor.v1.KeySet.toObject(message.keys, options);
                            if (message.limit != null && message.hasOwnProperty("limit"))
                                object.limit = message.limit;
                            return object;
                        };
    
                        /**
                         * Converts this ReadAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ReadAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ReadAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ReadAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ReadAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ReadAction";
                        };
    
                        return ReadAction;
                    })();
    
                    v1.QueryAction = (function() {
    
                        /**
                         * Properties of a QueryAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IQueryAction
                         * @property {string|null} [sql] QueryAction sql
                         * @property {Array.<google.spanner.executor.v1.QueryAction.IParameter>|null} [params] QueryAction params
                         */
    
                        /**
                         * Constructs a new QueryAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a QueryAction.
                         * @implements IQueryAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IQueryAction=} [properties] Properties to set
                         */
                        function QueryAction(properties) {
                            this.params = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * QueryAction sql.
                         * @member {string} sql
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @instance
                         */
                        QueryAction.prototype.sql = "";
    
                        /**
                         * QueryAction params.
                         * @member {Array.<google.spanner.executor.v1.QueryAction.IParameter>} params
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @instance
                         */
                        QueryAction.prototype.params = $util.emptyArray;
    
                        /**
                         * Creates a new QueryAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.QueryAction} QueryAction instance
                         */
                        QueryAction.create = function create(properties) {
                            return new QueryAction(properties);
                        };
    
                        /**
                         * Encodes the specified QueryAction message. Does not implicitly {@link google.spanner.executor.v1.QueryAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryAction} message QueryAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.sql != null && Object.hasOwnProperty.call(message, "sql"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.sql);
                            if (message.params != null && message.params.length)
                                for (var i = 0; i < message.params.length; ++i)
                                    $root.google.spanner.executor.v1.QueryAction.Parameter.encode(message.params[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified QueryAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.QueryAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryAction} message QueryAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a QueryAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.QueryAction} QueryAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.QueryAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.sql = reader.string();
                                        break;
                                    }
                                case 2: {
                                        if (!(message.params && message.params.length))
                                            message.params = [];
                                        message.params.push($root.google.spanner.executor.v1.QueryAction.Parameter.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a QueryAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.QueryAction} QueryAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a QueryAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        QueryAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.sql != null && message.hasOwnProperty("sql"))
                                if (!$util.isString(message.sql))
                                    return "sql: string expected";
                            if (message.params != null && message.hasOwnProperty("params")) {
                                if (!Array.isArray(message.params))
                                    return "params: array expected";
                                for (var i = 0; i < message.params.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.QueryAction.Parameter.verify(message.params[i]);
                                    if (error)
                                        return "params." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a QueryAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.QueryAction} QueryAction
                         */
                        QueryAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.QueryAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.QueryAction();
                            if (object.sql != null)
                                message.sql = String(object.sql);
                            if (object.params) {
                                if (!Array.isArray(object.params))
                                    throw TypeError(".google.spanner.executor.v1.QueryAction.params: array expected");
                                message.params = [];
                                for (var i = 0; i < object.params.length; ++i) {
                                    if (typeof object.params[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.QueryAction.params: object expected");
                                    message.params[i] = $root.google.spanner.executor.v1.QueryAction.Parameter.fromObject(object.params[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a QueryAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {google.spanner.executor.v1.QueryAction} message QueryAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        QueryAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.params = [];
                            if (options.defaults)
                                object.sql = "";
                            if (message.sql != null && message.hasOwnProperty("sql"))
                                object.sql = message.sql;
                            if (message.params && message.params.length) {
                                object.params = [];
                                for (var j = 0; j < message.params.length; ++j)
                                    object.params[j] = $root.google.spanner.executor.v1.QueryAction.Parameter.toObject(message.params[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this QueryAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        QueryAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for QueryAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.QueryAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        QueryAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.QueryAction";
                        };
    
                        QueryAction.Parameter = (function() {
    
                            /**
                             * Properties of a Parameter.
                             * @memberof google.spanner.executor.v1.QueryAction
                             * @interface IParameter
                             * @property {string|null} [name] Parameter name
                             * @property {google.spanner.v1.IType|null} [type] Parameter type
                             * @property {google.spanner.executor.v1.IValue|null} [value] Parameter value
                             */
    
                            /**
                             * Constructs a new Parameter.
                             * @memberof google.spanner.executor.v1.QueryAction
                             * @classdesc Represents a Parameter.
                             * @implements IParameter
                             * @constructor
                             * @param {google.spanner.executor.v1.QueryAction.IParameter=} [properties] Properties to set
                             */
                            function Parameter(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Parameter name.
                             * @member {string} name
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @instance
                             */
                            Parameter.prototype.name = "";
    
                            /**
                             * Parameter type.
                             * @member {google.spanner.v1.IType|null|undefined} type
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @instance
                             */
                            Parameter.prototype.type = null;
    
                            /**
                             * Parameter value.
                             * @member {google.spanner.executor.v1.IValue|null|undefined} value
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @instance
                             */
                            Parameter.prototype.value = null;
    
                            /**
                             * Creates a new Parameter instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {google.spanner.executor.v1.QueryAction.IParameter=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.QueryAction.Parameter} Parameter instance
                             */
                            Parameter.create = function create(properties) {
                                return new Parameter(properties);
                            };
    
                            /**
                             * Encodes the specified Parameter message. Does not implicitly {@link google.spanner.executor.v1.QueryAction.Parameter.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {google.spanner.executor.v1.QueryAction.IParameter} message Parameter message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Parameter.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                    $root.google.spanner.v1.Type.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                                    $root.google.spanner.executor.v1.Value.encode(message.value, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Parameter message, length delimited. Does not implicitly {@link google.spanner.executor.v1.QueryAction.Parameter.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {google.spanner.executor.v1.QueryAction.IParameter} message Parameter message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Parameter.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Parameter message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.QueryAction.Parameter} Parameter
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Parameter.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.QueryAction.Parameter();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.type = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.value = $root.google.spanner.executor.v1.Value.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Parameter message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.QueryAction.Parameter} Parameter
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Parameter.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Parameter message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Parameter.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.type != null && message.hasOwnProperty("type")) {
                                    var error = $root.google.spanner.v1.Type.verify(message.type);
                                    if (error)
                                        return "type." + error;
                                }
                                if (message.value != null && message.hasOwnProperty("value")) {
                                    var error = $root.google.spanner.executor.v1.Value.verify(message.value);
                                    if (error)
                                        return "value." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a Parameter message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.QueryAction.Parameter} Parameter
                             */
                            Parameter.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.QueryAction.Parameter)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.QueryAction.Parameter();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.type != null) {
                                    if (typeof object.type !== "object")
                                        throw TypeError(".google.spanner.executor.v1.QueryAction.Parameter.type: object expected");
                                    message.type = $root.google.spanner.v1.Type.fromObject(object.type);
                                }
                                if (object.value != null) {
                                    if (typeof object.value !== "object")
                                        throw TypeError(".google.spanner.executor.v1.QueryAction.Parameter.value: object expected");
                                    message.value = $root.google.spanner.executor.v1.Value.fromObject(object.value);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Parameter message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {google.spanner.executor.v1.QueryAction.Parameter} message Parameter
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Parameter.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.type = null;
                                    object.value = null;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.type != null && message.hasOwnProperty("type"))
                                    object.type = $root.google.spanner.v1.Type.toObject(message.type, options);
                                if (message.value != null && message.hasOwnProperty("value"))
                                    object.value = $root.google.spanner.executor.v1.Value.toObject(message.value, options);
                                return object;
                            };
    
                            /**
                             * Converts this Parameter to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Parameter.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Parameter
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.QueryAction.Parameter
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Parameter.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.QueryAction.Parameter";
                            };
    
                            return Parameter;
                        })();
    
                        return QueryAction;
                    })();
    
                    v1.DmlAction = (function() {
    
                        /**
                         * Properties of a DmlAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IDmlAction
                         * @property {google.spanner.executor.v1.IQueryAction|null} [update] DmlAction update
                         * @property {boolean|null} [autocommitIfSupported] DmlAction autocommitIfSupported
                         */
    
                        /**
                         * Constructs a new DmlAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DmlAction.
                         * @implements IDmlAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IDmlAction=} [properties] Properties to set
                         */
                        function DmlAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DmlAction update.
                         * @member {google.spanner.executor.v1.IQueryAction|null|undefined} update
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @instance
                         */
                        DmlAction.prototype.update = null;
    
                        /**
                         * DmlAction autocommitIfSupported.
                         * @member {boolean|null|undefined} autocommitIfSupported
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @instance
                         */
                        DmlAction.prototype.autocommitIfSupported = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(DmlAction.prototype, "_autocommitIfSupported", {
                            get: $util.oneOfGetter($oneOfFields = ["autocommitIfSupported"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new DmlAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IDmlAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DmlAction} DmlAction instance
                         */
                        DmlAction.create = function create(properties) {
                            return new DmlAction(properties);
                        };
    
                        /**
                         * Encodes the specified DmlAction message. Does not implicitly {@link google.spanner.executor.v1.DmlAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IDmlAction} message DmlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DmlAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.update != null && Object.hasOwnProperty.call(message, "update"))
                                $root.google.spanner.executor.v1.QueryAction.encode(message.update, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.autocommitIfSupported != null && Object.hasOwnProperty.call(message, "autocommitIfSupported"))
                                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.autocommitIfSupported);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DmlAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DmlAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IDmlAction} message DmlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DmlAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DmlAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DmlAction} DmlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DmlAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DmlAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.update = $root.google.spanner.executor.v1.QueryAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.autocommitIfSupported = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DmlAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DmlAction} DmlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DmlAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DmlAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DmlAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.update != null && message.hasOwnProperty("update")) {
                                var error = $root.google.spanner.executor.v1.QueryAction.verify(message.update);
                                if (error)
                                    return "update." + error;
                            }
                            if (message.autocommitIfSupported != null && message.hasOwnProperty("autocommitIfSupported")) {
                                properties._autocommitIfSupported = 1;
                                if (typeof message.autocommitIfSupported !== "boolean")
                                    return "autocommitIfSupported: boolean expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a DmlAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DmlAction} DmlAction
                         */
                        DmlAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DmlAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DmlAction();
                            if (object.update != null) {
                                if (typeof object.update !== "object")
                                    throw TypeError(".google.spanner.executor.v1.DmlAction.update: object expected");
                                message.update = $root.google.spanner.executor.v1.QueryAction.fromObject(object.update);
                            }
                            if (object.autocommitIfSupported != null)
                                message.autocommitIfSupported = Boolean(object.autocommitIfSupported);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DmlAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {google.spanner.executor.v1.DmlAction} message DmlAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DmlAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.update = null;
                            if (message.update != null && message.hasOwnProperty("update"))
                                object.update = $root.google.spanner.executor.v1.QueryAction.toObject(message.update, options);
                            if (message.autocommitIfSupported != null && message.hasOwnProperty("autocommitIfSupported")) {
                                object.autocommitIfSupported = message.autocommitIfSupported;
                                if (options.oneofs)
                                    object._autocommitIfSupported = "autocommitIfSupported";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this DmlAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DmlAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DmlAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DmlAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DmlAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DmlAction";
                        };
    
                        return DmlAction;
                    })();
    
                    v1.BatchDmlAction = (function() {
    
                        /**
                         * Properties of a BatchDmlAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IBatchDmlAction
                         * @property {Array.<google.spanner.executor.v1.IQueryAction>|null} [updates] BatchDmlAction updates
                         */
    
                        /**
                         * Constructs a new BatchDmlAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a BatchDmlAction.
                         * @implements IBatchDmlAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IBatchDmlAction=} [properties] Properties to set
                         */
                        function BatchDmlAction(properties) {
                            this.updates = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * BatchDmlAction updates.
                         * @member {Array.<google.spanner.executor.v1.IQueryAction>} updates
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @instance
                         */
                        BatchDmlAction.prototype.updates = $util.emptyArray;
    
                        /**
                         * Creates a new BatchDmlAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IBatchDmlAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.BatchDmlAction} BatchDmlAction instance
                         */
                        BatchDmlAction.create = function create(properties) {
                            return new BatchDmlAction(properties);
                        };
    
                        /**
                         * Encodes the specified BatchDmlAction message. Does not implicitly {@link google.spanner.executor.v1.BatchDmlAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IBatchDmlAction} message BatchDmlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        BatchDmlAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.updates != null && message.updates.length)
                                for (var i = 0; i < message.updates.length; ++i)
                                    $root.google.spanner.executor.v1.QueryAction.encode(message.updates[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified BatchDmlAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.BatchDmlAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {google.spanner.executor.v1.IBatchDmlAction} message BatchDmlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        BatchDmlAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a BatchDmlAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.BatchDmlAction} BatchDmlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        BatchDmlAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.BatchDmlAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.updates && message.updates.length))
                                            message.updates = [];
                                        message.updates.push($root.google.spanner.executor.v1.QueryAction.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a BatchDmlAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.BatchDmlAction} BatchDmlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        BatchDmlAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a BatchDmlAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        BatchDmlAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.updates != null && message.hasOwnProperty("updates")) {
                                if (!Array.isArray(message.updates))
                                    return "updates: array expected";
                                for (var i = 0; i < message.updates.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.QueryAction.verify(message.updates[i]);
                                    if (error)
                                        return "updates." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a BatchDmlAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.BatchDmlAction} BatchDmlAction
                         */
                        BatchDmlAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.BatchDmlAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.BatchDmlAction();
                            if (object.updates) {
                                if (!Array.isArray(object.updates))
                                    throw TypeError(".google.spanner.executor.v1.BatchDmlAction.updates: array expected");
                                message.updates = [];
                                for (var i = 0; i < object.updates.length; ++i) {
                                    if (typeof object.updates[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.BatchDmlAction.updates: object expected");
                                    message.updates[i] = $root.google.spanner.executor.v1.QueryAction.fromObject(object.updates[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a BatchDmlAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {google.spanner.executor.v1.BatchDmlAction} message BatchDmlAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        BatchDmlAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.updates = [];
                            if (message.updates && message.updates.length) {
                                object.updates = [];
                                for (var j = 0; j < message.updates.length; ++j)
                                    object.updates[j] = $root.google.spanner.executor.v1.QueryAction.toObject(message.updates[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this BatchDmlAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        BatchDmlAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for BatchDmlAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.BatchDmlAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        BatchDmlAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.BatchDmlAction";
                        };
    
                        return BatchDmlAction;
                    })();
    
                    v1.Value = (function() {
    
                        /**
                         * Properties of a Value.
                         * @memberof google.spanner.executor.v1
                         * @interface IValue
                         * @property {boolean|null} [isNull] Value isNull
                         * @property {number|Long|null} [intValue] Value intValue
                         * @property {boolean|null} [boolValue] Value boolValue
                         * @property {number|null} [doubleValue] Value doubleValue
                         * @property {Uint8Array|null} [bytesValue] Value bytesValue
                         * @property {string|null} [stringValue] Value stringValue
                         * @property {google.spanner.executor.v1.IValueList|null} [structValue] Value structValue
                         * @property {google.protobuf.ITimestamp|null} [timestampValue] Value timestampValue
                         * @property {number|null} [dateDaysValue] Value dateDaysValue
                         * @property {boolean|null} [isCommitTimestamp] Value isCommitTimestamp
                         * @property {google.spanner.executor.v1.IValueList|null} [arrayValue] Value arrayValue
                         * @property {google.spanner.v1.IType|null} [arrayType] Value arrayType
                         */
    
                        /**
                         * Constructs a new Value.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a Value.
                         * @implements IValue
                         * @constructor
                         * @param {google.spanner.executor.v1.IValue=} [properties] Properties to set
                         */
                        function Value(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Value isNull.
                         * @member {boolean|null|undefined} isNull
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.isNull = null;
    
                        /**
                         * Value intValue.
                         * @member {number|Long|null|undefined} intValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.intValue = null;
    
                        /**
                         * Value boolValue.
                         * @member {boolean|null|undefined} boolValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.boolValue = null;
    
                        /**
                         * Value doubleValue.
                         * @member {number|null|undefined} doubleValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.doubleValue = null;
    
                        /**
                         * Value bytesValue.
                         * @member {Uint8Array|null|undefined} bytesValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.bytesValue = null;
    
                        /**
                         * Value stringValue.
                         * @member {string|null|undefined} stringValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.stringValue = null;
    
                        /**
                         * Value structValue.
                         * @member {google.spanner.executor.v1.IValueList|null|undefined} structValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.structValue = null;
    
                        /**
                         * Value timestampValue.
                         * @member {google.protobuf.ITimestamp|null|undefined} timestampValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.timestampValue = null;
    
                        /**
                         * Value dateDaysValue.
                         * @member {number|null|undefined} dateDaysValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.dateDaysValue = null;
    
                        /**
                         * Value isCommitTimestamp.
                         * @member {boolean|null|undefined} isCommitTimestamp
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.isCommitTimestamp = null;
    
                        /**
                         * Value arrayValue.
                         * @member {google.spanner.executor.v1.IValueList|null|undefined} arrayValue
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.arrayValue = null;
    
                        /**
                         * Value arrayType.
                         * @member {google.spanner.v1.IType|null|undefined} arrayType
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Value.prototype.arrayType = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * Value valueType.
                         * @member {"isNull"|"intValue"|"boolValue"|"doubleValue"|"bytesValue"|"stringValue"|"structValue"|"timestampValue"|"dateDaysValue"|"isCommitTimestamp"|"arrayValue"|undefined} valueType
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         */
                        Object.defineProperty(Value.prototype, "valueType", {
                            get: $util.oneOfGetter($oneOfFields = ["isNull", "intValue", "boolValue", "doubleValue", "bytesValue", "stringValue", "structValue", "timestampValue", "dateDaysValue", "isCommitTimestamp", "arrayValue"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(Value.prototype, "_arrayType", {
                            get: $util.oneOfGetter($oneOfFields = ["arrayType"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new Value instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {google.spanner.executor.v1.IValue=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.Value} Value instance
                         */
                        Value.create = function create(properties) {
                            return new Value(properties);
                        };
    
                        /**
                         * Encodes the specified Value message. Does not implicitly {@link google.spanner.executor.v1.Value.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {google.spanner.executor.v1.IValue} message Value message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Value.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.isNull != null && Object.hasOwnProperty.call(message, "isNull"))
                                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.isNull);
                            if (message.intValue != null && Object.hasOwnProperty.call(message, "intValue"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int64(message.intValue);
                            if (message.boolValue != null && Object.hasOwnProperty.call(message, "boolValue"))
                                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.boolValue);
                            if (message.doubleValue != null && Object.hasOwnProperty.call(message, "doubleValue"))
                                writer.uint32(/* id 4, wireType 1 =*/33).double(message.doubleValue);
                            if (message.bytesValue != null && Object.hasOwnProperty.call(message, "bytesValue"))
                                writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.bytesValue);
                            if (message.stringValue != null && Object.hasOwnProperty.call(message, "stringValue"))
                                writer.uint32(/* id 6, wireType 2 =*/50).string(message.stringValue);
                            if (message.structValue != null && Object.hasOwnProperty.call(message, "structValue"))
                                $root.google.spanner.executor.v1.ValueList.encode(message.structValue, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            if (message.timestampValue != null && Object.hasOwnProperty.call(message, "timestampValue"))
                                $root.google.protobuf.Timestamp.encode(message.timestampValue, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                            if (message.dateDaysValue != null && Object.hasOwnProperty.call(message, "dateDaysValue"))
                                writer.uint32(/* id 9, wireType 0 =*/72).int32(message.dateDaysValue);
                            if (message.isCommitTimestamp != null && Object.hasOwnProperty.call(message, "isCommitTimestamp"))
                                writer.uint32(/* id 10, wireType 0 =*/80).bool(message.isCommitTimestamp);
                            if (message.arrayValue != null && Object.hasOwnProperty.call(message, "arrayValue"))
                                $root.google.spanner.executor.v1.ValueList.encode(message.arrayValue, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                            if (message.arrayType != null && Object.hasOwnProperty.call(message, "arrayType"))
                                $root.google.spanner.v1.Type.encode(message.arrayType, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Value message, length delimited. Does not implicitly {@link google.spanner.executor.v1.Value.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {google.spanner.executor.v1.IValue} message Value message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Value.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Value message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.Value} Value
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Value.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.Value();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.isNull = reader.bool();
                                        break;
                                    }
                                case 2: {
                                        message.intValue = reader.int64();
                                        break;
                                    }
                                case 3: {
                                        message.boolValue = reader.bool();
                                        break;
                                    }
                                case 4: {
                                        message.doubleValue = reader.double();
                                        break;
                                    }
                                case 5: {
                                        message.bytesValue = reader.bytes();
                                        break;
                                    }
                                case 6: {
                                        message.stringValue = reader.string();
                                        break;
                                    }
                                case 7: {
                                        message.structValue = $root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 8: {
                                        message.timestampValue = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 9: {
                                        message.dateDaysValue = reader.int32();
                                        break;
                                    }
                                case 10: {
                                        message.isCommitTimestamp = reader.bool();
                                        break;
                                    }
                                case 11: {
                                        message.arrayValue = $root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 12: {
                                        message.arrayType = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Value message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.Value} Value
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Value.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Value message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Value.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.isNull != null && message.hasOwnProperty("isNull")) {
                                properties.valueType = 1;
                                if (typeof message.isNull !== "boolean")
                                    return "isNull: boolean expected";
                            }
                            if (message.intValue != null && message.hasOwnProperty("intValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (!$util.isInteger(message.intValue) && !(message.intValue && $util.isInteger(message.intValue.low) && $util.isInteger(message.intValue.high)))
                                    return "intValue: integer|Long expected";
                            }
                            if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (typeof message.boolValue !== "boolean")
                                    return "boolValue: boolean expected";
                            }
                            if (message.doubleValue != null && message.hasOwnProperty("doubleValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (typeof message.doubleValue !== "number")
                                    return "doubleValue: number expected";
                            }
                            if (message.bytesValue != null && message.hasOwnProperty("bytesValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (!(message.bytesValue && typeof message.bytesValue.length === "number" || $util.isString(message.bytesValue)))
                                    return "bytesValue: buffer expected";
                            }
                            if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (!$util.isString(message.stringValue))
                                    return "stringValue: string expected";
                            }
                            if (message.structValue != null && message.hasOwnProperty("structValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ValueList.verify(message.structValue);
                                    if (error)
                                        return "structValue." + error;
                                }
                            }
                            if (message.timestampValue != null && message.hasOwnProperty("timestampValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.timestampValue);
                                    if (error)
                                        return "timestampValue." + error;
                                }
                            }
                            if (message.dateDaysValue != null && message.hasOwnProperty("dateDaysValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (!$util.isInteger(message.dateDaysValue))
                                    return "dateDaysValue: integer expected";
                            }
                            if (message.isCommitTimestamp != null && message.hasOwnProperty("isCommitTimestamp")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                if (typeof message.isCommitTimestamp !== "boolean")
                                    return "isCommitTimestamp: boolean expected";
                            }
                            if (message.arrayValue != null && message.hasOwnProperty("arrayValue")) {
                                if (properties.valueType === 1)
                                    return "valueType: multiple values";
                                properties.valueType = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ValueList.verify(message.arrayValue);
                                    if (error)
                                        return "arrayValue." + error;
                                }
                            }
                            if (message.arrayType != null && message.hasOwnProperty("arrayType")) {
                                properties._arrayType = 1;
                                {
                                    var error = $root.google.spanner.v1.Type.verify(message.arrayType);
                                    if (error)
                                        return "arrayType." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a Value message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.Value} Value
                         */
                        Value.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.Value)
                                return object;
                            var message = new $root.google.spanner.executor.v1.Value();
                            if (object.isNull != null)
                                message.isNull = Boolean(object.isNull);
                            if (object.intValue != null)
                                if ($util.Long)
                                    (message.intValue = $util.Long.fromValue(object.intValue)).unsigned = false;
                                else if (typeof object.intValue === "string")
                                    message.intValue = parseInt(object.intValue, 10);
                                else if (typeof object.intValue === "number")
                                    message.intValue = object.intValue;
                                else if (typeof object.intValue === "object")
                                    message.intValue = new $util.LongBits(object.intValue.low >>> 0, object.intValue.high >>> 0).toNumber();
                            if (object.boolValue != null)
                                message.boolValue = Boolean(object.boolValue);
                            if (object.doubleValue != null)
                                message.doubleValue = Number(object.doubleValue);
                            if (object.bytesValue != null)
                                if (typeof object.bytesValue === "string")
                                    $util.base64.decode(object.bytesValue, message.bytesValue = $util.newBuffer($util.base64.length(object.bytesValue)), 0);
                                else if (object.bytesValue.length >= 0)
                                    message.bytesValue = object.bytesValue;
                            if (object.stringValue != null)
                                message.stringValue = String(object.stringValue);
                            if (object.structValue != null) {
                                if (typeof object.structValue !== "object")
                                    throw TypeError(".google.spanner.executor.v1.Value.structValue: object expected");
                                message.structValue = $root.google.spanner.executor.v1.ValueList.fromObject(object.structValue);
                            }
                            if (object.timestampValue != null) {
                                if (typeof object.timestampValue !== "object")
                                    throw TypeError(".google.spanner.executor.v1.Value.timestampValue: object expected");
                                message.timestampValue = $root.google.protobuf.Timestamp.fromObject(object.timestampValue);
                            }
                            if (object.dateDaysValue != null)
                                message.dateDaysValue = object.dateDaysValue | 0;
                            if (object.isCommitTimestamp != null)
                                message.isCommitTimestamp = Boolean(object.isCommitTimestamp);
                            if (object.arrayValue != null) {
                                if (typeof object.arrayValue !== "object")
                                    throw TypeError(".google.spanner.executor.v1.Value.arrayValue: object expected");
                                message.arrayValue = $root.google.spanner.executor.v1.ValueList.fromObject(object.arrayValue);
                            }
                            if (object.arrayType != null) {
                                if (typeof object.arrayType !== "object")
                                    throw TypeError(".google.spanner.executor.v1.Value.arrayType: object expected");
                                message.arrayType = $root.google.spanner.v1.Type.fromObject(object.arrayType);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Value message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {google.spanner.executor.v1.Value} message Value
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Value.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (message.isNull != null && message.hasOwnProperty("isNull")) {
                                object.isNull = message.isNull;
                                if (options.oneofs)
                                    object.valueType = "isNull";
                            }
                            if (message.intValue != null && message.hasOwnProperty("intValue")) {
                                if (typeof message.intValue === "number")
                                    object.intValue = options.longs === String ? String(message.intValue) : message.intValue;
                                else
                                    object.intValue = options.longs === String ? $util.Long.prototype.toString.call(message.intValue) : options.longs === Number ? new $util.LongBits(message.intValue.low >>> 0, message.intValue.high >>> 0).toNumber() : message.intValue;
                                if (options.oneofs)
                                    object.valueType = "intValue";
                            }
                            if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                                object.boolValue = message.boolValue;
                                if (options.oneofs)
                                    object.valueType = "boolValue";
                            }
                            if (message.doubleValue != null && message.hasOwnProperty("doubleValue")) {
                                object.doubleValue = options.json && !isFinite(message.doubleValue) ? String(message.doubleValue) : message.doubleValue;
                                if (options.oneofs)
                                    object.valueType = "doubleValue";
                            }
                            if (message.bytesValue != null && message.hasOwnProperty("bytesValue")) {
                                object.bytesValue = options.bytes === String ? $util.base64.encode(message.bytesValue, 0, message.bytesValue.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytesValue) : message.bytesValue;
                                if (options.oneofs)
                                    object.valueType = "bytesValue";
                            }
                            if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                                object.stringValue = message.stringValue;
                                if (options.oneofs)
                                    object.valueType = "stringValue";
                            }
                            if (message.structValue != null && message.hasOwnProperty("structValue")) {
                                object.structValue = $root.google.spanner.executor.v1.ValueList.toObject(message.structValue, options);
                                if (options.oneofs)
                                    object.valueType = "structValue";
                            }
                            if (message.timestampValue != null && message.hasOwnProperty("timestampValue")) {
                                object.timestampValue = $root.google.protobuf.Timestamp.toObject(message.timestampValue, options);
                                if (options.oneofs)
                                    object.valueType = "timestampValue";
                            }
                            if (message.dateDaysValue != null && message.hasOwnProperty("dateDaysValue")) {
                                object.dateDaysValue = message.dateDaysValue;
                                if (options.oneofs)
                                    object.valueType = "dateDaysValue";
                            }
                            if (message.isCommitTimestamp != null && message.hasOwnProperty("isCommitTimestamp")) {
                                object.isCommitTimestamp = message.isCommitTimestamp;
                                if (options.oneofs)
                                    object.valueType = "isCommitTimestamp";
                            }
                            if (message.arrayValue != null && message.hasOwnProperty("arrayValue")) {
                                object.arrayValue = $root.google.spanner.executor.v1.ValueList.toObject(message.arrayValue, options);
                                if (options.oneofs)
                                    object.valueType = "arrayValue";
                            }
                            if (message.arrayType != null && message.hasOwnProperty("arrayType")) {
                                object.arrayType = $root.google.spanner.v1.Type.toObject(message.arrayType, options);
                                if (options.oneofs)
                                    object._arrayType = "arrayType";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this Value to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.Value
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Value.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Value
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.Value
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.Value";
                        };
    
                        return Value;
                    })();
    
                    v1.KeyRange = (function() {
    
                        /**
                         * Properties of a KeyRange.
                         * @memberof google.spanner.executor.v1
                         * @interface IKeyRange
                         * @property {google.spanner.executor.v1.IValueList|null} [start] KeyRange start
                         * @property {google.spanner.executor.v1.IValueList|null} [limit] KeyRange limit
                         * @property {google.spanner.executor.v1.KeyRange.Type|null} [type] KeyRange type
                         */
    
                        /**
                         * Constructs a new KeyRange.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a KeyRange.
                         * @implements IKeyRange
                         * @constructor
                         * @param {google.spanner.executor.v1.IKeyRange=} [properties] Properties to set
                         */
                        function KeyRange(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * KeyRange start.
                         * @member {google.spanner.executor.v1.IValueList|null|undefined} start
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @instance
                         */
                        KeyRange.prototype.start = null;
    
                        /**
                         * KeyRange limit.
                         * @member {google.spanner.executor.v1.IValueList|null|undefined} limit
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @instance
                         */
                        KeyRange.prototype.limit = null;
    
                        /**
                         * KeyRange type.
                         * @member {google.spanner.executor.v1.KeyRange.Type|null|undefined} type
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @instance
                         */
                        KeyRange.prototype.type = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(KeyRange.prototype, "_type", {
                            get: $util.oneOfGetter($oneOfFields = ["type"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new KeyRange instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {google.spanner.executor.v1.IKeyRange=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.KeyRange} KeyRange instance
                         */
                        KeyRange.create = function create(properties) {
                            return new KeyRange(properties);
                        };
    
                        /**
                         * Encodes the specified KeyRange message. Does not implicitly {@link google.spanner.executor.v1.KeyRange.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {google.spanner.executor.v1.IKeyRange} message KeyRange message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        KeyRange.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                                $root.google.spanner.executor.v1.ValueList.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.limit != null && Object.hasOwnProperty.call(message, "limit"))
                                $root.google.spanner.executor.v1.ValueList.encode(message.limit, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified KeyRange message, length delimited. Does not implicitly {@link google.spanner.executor.v1.KeyRange.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {google.spanner.executor.v1.IKeyRange} message KeyRange message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        KeyRange.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a KeyRange message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.KeyRange} KeyRange
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        KeyRange.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.KeyRange();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.start = $root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.limit = $root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.type = reader.int32();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a KeyRange message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.KeyRange} KeyRange
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        KeyRange.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a KeyRange message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        KeyRange.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.start != null && message.hasOwnProperty("start")) {
                                var error = $root.google.spanner.executor.v1.ValueList.verify(message.start);
                                if (error)
                                    return "start." + error;
                            }
                            if (message.limit != null && message.hasOwnProperty("limit")) {
                                var error = $root.google.spanner.executor.v1.ValueList.verify(message.limit);
                                if (error)
                                    return "limit." + error;
                            }
                            if (message.type != null && message.hasOwnProperty("type")) {
                                properties._type = 1;
                                switch (message.type) {
                                default:
                                    return "type: enum value expected";
                                case 0:
                                case 1:
                                case 2:
                                case 3:
                                case 4:
                                    break;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a KeyRange message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.KeyRange} KeyRange
                         */
                        KeyRange.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.KeyRange)
                                return object;
                            var message = new $root.google.spanner.executor.v1.KeyRange();
                            if (object.start != null) {
                                if (typeof object.start !== "object")
                                    throw TypeError(".google.spanner.executor.v1.KeyRange.start: object expected");
                                message.start = $root.google.spanner.executor.v1.ValueList.fromObject(object.start);
                            }
                            if (object.limit != null) {
                                if (typeof object.limit !== "object")
                                    throw TypeError(".google.spanner.executor.v1.KeyRange.limit: object expected");
                                message.limit = $root.google.spanner.executor.v1.ValueList.fromObject(object.limit);
                            }
                            switch (object.type) {
                            default:
                                if (typeof object.type === "number") {
                                    message.type = object.type;
                                    break;
                                }
                                break;
                            case "TYPE_UNSPECIFIED":
                            case 0:
                                message.type = 0;
                                break;
                            case "CLOSED_CLOSED":
                            case 1:
                                message.type = 1;
                                break;
                            case "CLOSED_OPEN":
                            case 2:
                                message.type = 2;
                                break;
                            case "OPEN_CLOSED":
                            case 3:
                                message.type = 3;
                                break;
                            case "OPEN_OPEN":
                            case 4:
                                message.type = 4;
                                break;
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a KeyRange message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {google.spanner.executor.v1.KeyRange} message KeyRange
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        KeyRange.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.start = null;
                                object.limit = null;
                            }
                            if (message.start != null && message.hasOwnProperty("start"))
                                object.start = $root.google.spanner.executor.v1.ValueList.toObject(message.start, options);
                            if (message.limit != null && message.hasOwnProperty("limit"))
                                object.limit = $root.google.spanner.executor.v1.ValueList.toObject(message.limit, options);
                            if (message.type != null && message.hasOwnProperty("type")) {
                                object.type = options.enums === String ? $root.google.spanner.executor.v1.KeyRange.Type[message.type] === undefined ? message.type : $root.google.spanner.executor.v1.KeyRange.Type[message.type] : message.type;
                                if (options.oneofs)
                                    object._type = "type";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this KeyRange to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        KeyRange.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for KeyRange
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.KeyRange
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        KeyRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.KeyRange";
                        };
    
                        /**
                         * Type enum.
                         * @name google.spanner.executor.v1.KeyRange.Type
                         * @enum {number}
                         * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                         * @property {number} CLOSED_CLOSED=1 CLOSED_CLOSED value
                         * @property {number} CLOSED_OPEN=2 CLOSED_OPEN value
                         * @property {number} OPEN_CLOSED=3 OPEN_CLOSED value
                         * @property {number} OPEN_OPEN=4 OPEN_OPEN value
                         */
                        KeyRange.Type = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "CLOSED_CLOSED"] = 1;
                            values[valuesById[2] = "CLOSED_OPEN"] = 2;
                            values[valuesById[3] = "OPEN_CLOSED"] = 3;
                            values[valuesById[4] = "OPEN_OPEN"] = 4;
                            return values;
                        })();
    
                        return KeyRange;
                    })();
    
                    v1.KeySet = (function() {
    
                        /**
                         * Properties of a KeySet.
                         * @memberof google.spanner.executor.v1
                         * @interface IKeySet
                         * @property {Array.<google.spanner.executor.v1.IValueList>|null} [point] KeySet point
                         * @property {Array.<google.spanner.executor.v1.IKeyRange>|null} [range] KeySet range
                         * @property {boolean|null} [all] KeySet all
                         */
    
                        /**
                         * Constructs a new KeySet.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a KeySet.
                         * @implements IKeySet
                         * @constructor
                         * @param {google.spanner.executor.v1.IKeySet=} [properties] Properties to set
                         */
                        function KeySet(properties) {
                            this.point = [];
                            this.range = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * KeySet point.
                         * @member {Array.<google.spanner.executor.v1.IValueList>} point
                         * @memberof google.spanner.executor.v1.KeySet
                         * @instance
                         */
                        KeySet.prototype.point = $util.emptyArray;
    
                        /**
                         * KeySet range.
                         * @member {Array.<google.spanner.executor.v1.IKeyRange>} range
                         * @memberof google.spanner.executor.v1.KeySet
                         * @instance
                         */
                        KeySet.prototype.range = $util.emptyArray;
    
                        /**
                         * KeySet all.
                         * @member {boolean} all
                         * @memberof google.spanner.executor.v1.KeySet
                         * @instance
                         */
                        KeySet.prototype.all = false;
    
                        /**
                         * Creates a new KeySet instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {google.spanner.executor.v1.IKeySet=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.KeySet} KeySet instance
                         */
                        KeySet.create = function create(properties) {
                            return new KeySet(properties);
                        };
    
                        /**
                         * Encodes the specified KeySet message. Does not implicitly {@link google.spanner.executor.v1.KeySet.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {google.spanner.executor.v1.IKeySet} message KeySet message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        KeySet.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.point != null && message.point.length)
                                for (var i = 0; i < message.point.length; ++i)
                                    $root.google.spanner.executor.v1.ValueList.encode(message.point[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.range != null && message.range.length)
                                for (var i = 0; i < message.range.length; ++i)
                                    $root.google.spanner.executor.v1.KeyRange.encode(message.range[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.all != null && Object.hasOwnProperty.call(message, "all"))
                                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.all);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified KeySet message, length delimited. Does not implicitly {@link google.spanner.executor.v1.KeySet.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {google.spanner.executor.v1.IKeySet} message KeySet message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        KeySet.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a KeySet message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.KeySet} KeySet
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        KeySet.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.KeySet();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.point && message.point.length))
                                            message.point = [];
                                        message.point.push($root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        if (!(message.range && message.range.length))
                                            message.range = [];
                                        message.range.push($root.google.spanner.executor.v1.KeyRange.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        message.all = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a KeySet message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.KeySet} KeySet
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        KeySet.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a KeySet message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        KeySet.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.point != null && message.hasOwnProperty("point")) {
                                if (!Array.isArray(message.point))
                                    return "point: array expected";
                                for (var i = 0; i < message.point.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ValueList.verify(message.point[i]);
                                    if (error)
                                        return "point." + error;
                                }
                            }
                            if (message.range != null && message.hasOwnProperty("range")) {
                                if (!Array.isArray(message.range))
                                    return "range: array expected";
                                for (var i = 0; i < message.range.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.KeyRange.verify(message.range[i]);
                                    if (error)
                                        return "range." + error;
                                }
                            }
                            if (message.all != null && message.hasOwnProperty("all"))
                                if (typeof message.all !== "boolean")
                                    return "all: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a KeySet message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.KeySet} KeySet
                         */
                        KeySet.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.KeySet)
                                return object;
                            var message = new $root.google.spanner.executor.v1.KeySet();
                            if (object.point) {
                                if (!Array.isArray(object.point))
                                    throw TypeError(".google.spanner.executor.v1.KeySet.point: array expected");
                                message.point = [];
                                for (var i = 0; i < object.point.length; ++i) {
                                    if (typeof object.point[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.KeySet.point: object expected");
                                    message.point[i] = $root.google.spanner.executor.v1.ValueList.fromObject(object.point[i]);
                                }
                            }
                            if (object.range) {
                                if (!Array.isArray(object.range))
                                    throw TypeError(".google.spanner.executor.v1.KeySet.range: array expected");
                                message.range = [];
                                for (var i = 0; i < object.range.length; ++i) {
                                    if (typeof object.range[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.KeySet.range: object expected");
                                    message.range[i] = $root.google.spanner.executor.v1.KeyRange.fromObject(object.range[i]);
                                }
                            }
                            if (object.all != null)
                                message.all = Boolean(object.all);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a KeySet message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {google.spanner.executor.v1.KeySet} message KeySet
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        KeySet.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.point = [];
                                object.range = [];
                            }
                            if (options.defaults)
                                object.all = false;
                            if (message.point && message.point.length) {
                                object.point = [];
                                for (var j = 0; j < message.point.length; ++j)
                                    object.point[j] = $root.google.spanner.executor.v1.ValueList.toObject(message.point[j], options);
                            }
                            if (message.range && message.range.length) {
                                object.range = [];
                                for (var j = 0; j < message.range.length; ++j)
                                    object.range[j] = $root.google.spanner.executor.v1.KeyRange.toObject(message.range[j], options);
                            }
                            if (message.all != null && message.hasOwnProperty("all"))
                                object.all = message.all;
                            return object;
                        };
    
                        /**
                         * Converts this KeySet to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.KeySet
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        KeySet.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for KeySet
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.KeySet
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        KeySet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.KeySet";
                        };
    
                        return KeySet;
                    })();
    
                    v1.ValueList = (function() {
    
                        /**
                         * Properties of a ValueList.
                         * @memberof google.spanner.executor.v1
                         * @interface IValueList
                         * @property {Array.<google.spanner.executor.v1.IValue>|null} [value] ValueList value
                         */
    
                        /**
                         * Constructs a new ValueList.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ValueList.
                         * @implements IValueList
                         * @constructor
                         * @param {google.spanner.executor.v1.IValueList=} [properties] Properties to set
                         */
                        function ValueList(properties) {
                            this.value = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ValueList value.
                         * @member {Array.<google.spanner.executor.v1.IValue>} value
                         * @memberof google.spanner.executor.v1.ValueList
                         * @instance
                         */
                        ValueList.prototype.value = $util.emptyArray;
    
                        /**
                         * Creates a new ValueList instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {google.spanner.executor.v1.IValueList=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ValueList} ValueList instance
                         */
                        ValueList.create = function create(properties) {
                            return new ValueList(properties);
                        };
    
                        /**
                         * Encodes the specified ValueList message. Does not implicitly {@link google.spanner.executor.v1.ValueList.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {google.spanner.executor.v1.IValueList} message ValueList message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ValueList.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.value != null && message.value.length)
                                for (var i = 0; i < message.value.length; ++i)
                                    $root.google.spanner.executor.v1.Value.encode(message.value[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ValueList message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ValueList.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {google.spanner.executor.v1.IValueList} message ValueList message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ValueList.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ValueList message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ValueList} ValueList
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ValueList.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ValueList();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.value && message.value.length))
                                            message.value = [];
                                        message.value.push($root.google.spanner.executor.v1.Value.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ValueList message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ValueList} ValueList
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ValueList.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ValueList message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ValueList.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.value != null && message.hasOwnProperty("value")) {
                                if (!Array.isArray(message.value))
                                    return "value: array expected";
                                for (var i = 0; i < message.value.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.Value.verify(message.value[i]);
                                    if (error)
                                        return "value." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ValueList message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ValueList} ValueList
                         */
                        ValueList.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ValueList)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ValueList();
                            if (object.value) {
                                if (!Array.isArray(object.value))
                                    throw TypeError(".google.spanner.executor.v1.ValueList.value: array expected");
                                message.value = [];
                                for (var i = 0; i < object.value.length; ++i) {
                                    if (typeof object.value[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.ValueList.value: object expected");
                                    message.value[i] = $root.google.spanner.executor.v1.Value.fromObject(object.value[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ValueList message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {google.spanner.executor.v1.ValueList} message ValueList
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ValueList.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.value = [];
                            if (message.value && message.value.length) {
                                object.value = [];
                                for (var j = 0; j < message.value.length; ++j)
                                    object.value[j] = $root.google.spanner.executor.v1.Value.toObject(message.value[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ValueList to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ValueList
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ValueList.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ValueList
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ValueList
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ValueList.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ValueList";
                        };
    
                        return ValueList;
                    })();
    
                    v1.MutationAction = (function() {
    
                        /**
                         * Properties of a MutationAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IMutationAction
                         * @property {Array.<google.spanner.executor.v1.MutationAction.IMod>|null} [mod] MutationAction mod
                         */
    
                        /**
                         * Constructs a new MutationAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a MutationAction.
                         * @implements IMutationAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IMutationAction=} [properties] Properties to set
                         */
                        function MutationAction(properties) {
                            this.mod = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * MutationAction mod.
                         * @member {Array.<google.spanner.executor.v1.MutationAction.IMod>} mod
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @instance
                         */
                        MutationAction.prototype.mod = $util.emptyArray;
    
                        /**
                         * Creates a new MutationAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {google.spanner.executor.v1.IMutationAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.MutationAction} MutationAction instance
                         */
                        MutationAction.create = function create(properties) {
                            return new MutationAction(properties);
                        };
    
                        /**
                         * Encodes the specified MutationAction message. Does not implicitly {@link google.spanner.executor.v1.MutationAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {google.spanner.executor.v1.IMutationAction} message MutationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        MutationAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.mod != null && message.mod.length)
                                for (var i = 0; i < message.mod.length; ++i)
                                    $root.google.spanner.executor.v1.MutationAction.Mod.encode(message.mod[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified MutationAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.MutationAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {google.spanner.executor.v1.IMutationAction} message MutationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        MutationAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a MutationAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.MutationAction} MutationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        MutationAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.MutationAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.mod && message.mod.length))
                                            message.mod = [];
                                        message.mod.push($root.google.spanner.executor.v1.MutationAction.Mod.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a MutationAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.MutationAction} MutationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        MutationAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a MutationAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        MutationAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.mod != null && message.hasOwnProperty("mod")) {
                                if (!Array.isArray(message.mod))
                                    return "mod: array expected";
                                for (var i = 0; i < message.mod.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.MutationAction.Mod.verify(message.mod[i]);
                                    if (error)
                                        return "mod." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a MutationAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.MutationAction} MutationAction
                         */
                        MutationAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.MutationAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.MutationAction();
                            if (object.mod) {
                                if (!Array.isArray(object.mod))
                                    throw TypeError(".google.spanner.executor.v1.MutationAction.mod: array expected");
                                message.mod = [];
                                for (var i = 0; i < object.mod.length; ++i) {
                                    if (typeof object.mod[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.mod: object expected");
                                    message.mod[i] = $root.google.spanner.executor.v1.MutationAction.Mod.fromObject(object.mod[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a MutationAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {google.spanner.executor.v1.MutationAction} message MutationAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        MutationAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.mod = [];
                            if (message.mod && message.mod.length) {
                                object.mod = [];
                                for (var j = 0; j < message.mod.length; ++j)
                                    object.mod[j] = $root.google.spanner.executor.v1.MutationAction.Mod.toObject(message.mod[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this MutationAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        MutationAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for MutationAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.MutationAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        MutationAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.MutationAction";
                        };
    
                        MutationAction.InsertArgs = (function() {
    
                            /**
                             * Properties of an InsertArgs.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @interface IInsertArgs
                             * @property {Array.<string>|null} [column] InsertArgs column
                             * @property {Array.<google.spanner.v1.IType>|null} [type] InsertArgs type
                             * @property {Array.<google.spanner.executor.v1.IValueList>|null} [values] InsertArgs values
                             */
    
                            /**
                             * Constructs a new InsertArgs.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @classdesc Represents an InsertArgs.
                             * @implements IInsertArgs
                             * @constructor
                             * @param {google.spanner.executor.v1.MutationAction.IInsertArgs=} [properties] Properties to set
                             */
                            function InsertArgs(properties) {
                                this.column = [];
                                this.type = [];
                                this.values = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * InsertArgs column.
                             * @member {Array.<string>} column
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @instance
                             */
                            InsertArgs.prototype.column = $util.emptyArray;
    
                            /**
                             * InsertArgs type.
                             * @member {Array.<google.spanner.v1.IType>} type
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @instance
                             */
                            InsertArgs.prototype.type = $util.emptyArray;
    
                            /**
                             * InsertArgs values.
                             * @member {Array.<google.spanner.executor.v1.IValueList>} values
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @instance
                             */
                            InsertArgs.prototype.values = $util.emptyArray;
    
                            /**
                             * Creates a new InsertArgs instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IInsertArgs=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.MutationAction.InsertArgs} InsertArgs instance
                             */
                            InsertArgs.create = function create(properties) {
                                return new InsertArgs(properties);
                            };
    
                            /**
                             * Encodes the specified InsertArgs message. Does not implicitly {@link google.spanner.executor.v1.MutationAction.InsertArgs.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IInsertArgs} message InsertArgs message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InsertArgs.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.column != null && message.column.length)
                                    for (var i = 0; i < message.column.length; ++i)
                                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.column[i]);
                                if (message.type != null && message.type.length)
                                    for (var i = 0; i < message.type.length; ++i)
                                        $root.google.spanner.v1.Type.encode(message.type[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.values != null && message.values.length)
                                    for (var i = 0; i < message.values.length; ++i)
                                        $root.google.spanner.executor.v1.ValueList.encode(message.values[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified InsertArgs message, length delimited. Does not implicitly {@link google.spanner.executor.v1.MutationAction.InsertArgs.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IInsertArgs} message InsertArgs message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            InsertArgs.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an InsertArgs message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.MutationAction.InsertArgs} InsertArgs
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InsertArgs.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.MutationAction.InsertArgs();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.column && message.column.length))
                                                message.column = [];
                                            message.column.push(reader.string());
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.type && message.type.length))
                                                message.type = [];
                                            message.type.push($root.google.spanner.v1.Type.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.values && message.values.length))
                                                message.values = [];
                                            message.values.push($root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an InsertArgs message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.MutationAction.InsertArgs} InsertArgs
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            InsertArgs.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an InsertArgs message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            InsertArgs.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.column != null && message.hasOwnProperty("column")) {
                                    if (!Array.isArray(message.column))
                                        return "column: array expected";
                                    for (var i = 0; i < message.column.length; ++i)
                                        if (!$util.isString(message.column[i]))
                                            return "column: string[] expected";
                                }
                                if (message.type != null && message.hasOwnProperty("type")) {
                                    if (!Array.isArray(message.type))
                                        return "type: array expected";
                                    for (var i = 0; i < message.type.length; ++i) {
                                        var error = $root.google.spanner.v1.Type.verify(message.type[i]);
                                        if (error)
                                            return "type." + error;
                                    }
                                }
                                if (message.values != null && message.hasOwnProperty("values")) {
                                    if (!Array.isArray(message.values))
                                        return "values: array expected";
                                    for (var i = 0; i < message.values.length; ++i) {
                                        var error = $root.google.spanner.executor.v1.ValueList.verify(message.values[i]);
                                        if (error)
                                            return "values." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates an InsertArgs message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.MutationAction.InsertArgs} InsertArgs
                             */
                            InsertArgs.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.MutationAction.InsertArgs)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.MutationAction.InsertArgs();
                                if (object.column) {
                                    if (!Array.isArray(object.column))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.InsertArgs.column: array expected");
                                    message.column = [];
                                    for (var i = 0; i < object.column.length; ++i)
                                        message.column[i] = String(object.column[i]);
                                }
                                if (object.type) {
                                    if (!Array.isArray(object.type))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.InsertArgs.type: array expected");
                                    message.type = [];
                                    for (var i = 0; i < object.type.length; ++i) {
                                        if (typeof object.type[i] !== "object")
                                            throw TypeError(".google.spanner.executor.v1.MutationAction.InsertArgs.type: object expected");
                                        message.type[i] = $root.google.spanner.v1.Type.fromObject(object.type[i]);
                                    }
                                }
                                if (object.values) {
                                    if (!Array.isArray(object.values))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.InsertArgs.values: array expected");
                                    message.values = [];
                                    for (var i = 0; i < object.values.length; ++i) {
                                        if (typeof object.values[i] !== "object")
                                            throw TypeError(".google.spanner.executor.v1.MutationAction.InsertArgs.values: object expected");
                                        message.values[i] = $root.google.spanner.executor.v1.ValueList.fromObject(object.values[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an InsertArgs message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.InsertArgs} message InsertArgs
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            InsertArgs.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.column = [];
                                    object.type = [];
                                    object.values = [];
                                }
                                if (message.column && message.column.length) {
                                    object.column = [];
                                    for (var j = 0; j < message.column.length; ++j)
                                        object.column[j] = message.column[j];
                                }
                                if (message.type && message.type.length) {
                                    object.type = [];
                                    for (var j = 0; j < message.type.length; ++j)
                                        object.type[j] = $root.google.spanner.v1.Type.toObject(message.type[j], options);
                                }
                                if (message.values && message.values.length) {
                                    object.values = [];
                                    for (var j = 0; j < message.values.length; ++j)
                                        object.values[j] = $root.google.spanner.executor.v1.ValueList.toObject(message.values[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this InsertArgs to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            InsertArgs.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for InsertArgs
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.MutationAction.InsertArgs
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            InsertArgs.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.MutationAction.InsertArgs";
                            };
    
                            return InsertArgs;
                        })();
    
                        MutationAction.UpdateArgs = (function() {
    
                            /**
                             * Properties of an UpdateArgs.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @interface IUpdateArgs
                             * @property {Array.<string>|null} [column] UpdateArgs column
                             * @property {Array.<google.spanner.v1.IType>|null} [type] UpdateArgs type
                             * @property {Array.<google.spanner.executor.v1.IValueList>|null} [values] UpdateArgs values
                             */
    
                            /**
                             * Constructs a new UpdateArgs.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @classdesc Represents an UpdateArgs.
                             * @implements IUpdateArgs
                             * @constructor
                             * @param {google.spanner.executor.v1.MutationAction.IUpdateArgs=} [properties] Properties to set
                             */
                            function UpdateArgs(properties) {
                                this.column = [];
                                this.type = [];
                                this.values = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * UpdateArgs column.
                             * @member {Array.<string>} column
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @instance
                             */
                            UpdateArgs.prototype.column = $util.emptyArray;
    
                            /**
                             * UpdateArgs type.
                             * @member {Array.<google.spanner.v1.IType>} type
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @instance
                             */
                            UpdateArgs.prototype.type = $util.emptyArray;
    
                            /**
                             * UpdateArgs values.
                             * @member {Array.<google.spanner.executor.v1.IValueList>} values
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @instance
                             */
                            UpdateArgs.prototype.values = $util.emptyArray;
    
                            /**
                             * Creates a new UpdateArgs instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IUpdateArgs=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.MutationAction.UpdateArgs} UpdateArgs instance
                             */
                            UpdateArgs.create = function create(properties) {
                                return new UpdateArgs(properties);
                            };
    
                            /**
                             * Encodes the specified UpdateArgs message. Does not implicitly {@link google.spanner.executor.v1.MutationAction.UpdateArgs.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IUpdateArgs} message UpdateArgs message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateArgs.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.column != null && message.column.length)
                                    for (var i = 0; i < message.column.length; ++i)
                                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.column[i]);
                                if (message.type != null && message.type.length)
                                    for (var i = 0; i < message.type.length; ++i)
                                        $root.google.spanner.v1.Type.encode(message.type[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.values != null && message.values.length)
                                    for (var i = 0; i < message.values.length; ++i)
                                        $root.google.spanner.executor.v1.ValueList.encode(message.values[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified UpdateArgs message, length delimited. Does not implicitly {@link google.spanner.executor.v1.MutationAction.UpdateArgs.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IUpdateArgs} message UpdateArgs message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            UpdateArgs.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an UpdateArgs message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.MutationAction.UpdateArgs} UpdateArgs
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateArgs.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.MutationAction.UpdateArgs();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.column && message.column.length))
                                                message.column = [];
                                            message.column.push(reader.string());
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.type && message.type.length))
                                                message.type = [];
                                            message.type.push($root.google.spanner.v1.Type.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.values && message.values.length))
                                                message.values = [];
                                            message.values.push($root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an UpdateArgs message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.MutationAction.UpdateArgs} UpdateArgs
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            UpdateArgs.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an UpdateArgs message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            UpdateArgs.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.column != null && message.hasOwnProperty("column")) {
                                    if (!Array.isArray(message.column))
                                        return "column: array expected";
                                    for (var i = 0; i < message.column.length; ++i)
                                        if (!$util.isString(message.column[i]))
                                            return "column: string[] expected";
                                }
                                if (message.type != null && message.hasOwnProperty("type")) {
                                    if (!Array.isArray(message.type))
                                        return "type: array expected";
                                    for (var i = 0; i < message.type.length; ++i) {
                                        var error = $root.google.spanner.v1.Type.verify(message.type[i]);
                                        if (error)
                                            return "type." + error;
                                    }
                                }
                                if (message.values != null && message.hasOwnProperty("values")) {
                                    if (!Array.isArray(message.values))
                                        return "values: array expected";
                                    for (var i = 0; i < message.values.length; ++i) {
                                        var error = $root.google.spanner.executor.v1.ValueList.verify(message.values[i]);
                                        if (error)
                                            return "values." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates an UpdateArgs message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.MutationAction.UpdateArgs} UpdateArgs
                             */
                            UpdateArgs.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.MutationAction.UpdateArgs)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.MutationAction.UpdateArgs();
                                if (object.column) {
                                    if (!Array.isArray(object.column))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.UpdateArgs.column: array expected");
                                    message.column = [];
                                    for (var i = 0; i < object.column.length; ++i)
                                        message.column[i] = String(object.column[i]);
                                }
                                if (object.type) {
                                    if (!Array.isArray(object.type))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.UpdateArgs.type: array expected");
                                    message.type = [];
                                    for (var i = 0; i < object.type.length; ++i) {
                                        if (typeof object.type[i] !== "object")
                                            throw TypeError(".google.spanner.executor.v1.MutationAction.UpdateArgs.type: object expected");
                                        message.type[i] = $root.google.spanner.v1.Type.fromObject(object.type[i]);
                                    }
                                }
                                if (object.values) {
                                    if (!Array.isArray(object.values))
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.UpdateArgs.values: array expected");
                                    message.values = [];
                                    for (var i = 0; i < object.values.length; ++i) {
                                        if (typeof object.values[i] !== "object")
                                            throw TypeError(".google.spanner.executor.v1.MutationAction.UpdateArgs.values: object expected");
                                        message.values[i] = $root.google.spanner.executor.v1.ValueList.fromObject(object.values[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an UpdateArgs message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.UpdateArgs} message UpdateArgs
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            UpdateArgs.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.column = [];
                                    object.type = [];
                                    object.values = [];
                                }
                                if (message.column && message.column.length) {
                                    object.column = [];
                                    for (var j = 0; j < message.column.length; ++j)
                                        object.column[j] = message.column[j];
                                }
                                if (message.type && message.type.length) {
                                    object.type = [];
                                    for (var j = 0; j < message.type.length; ++j)
                                        object.type[j] = $root.google.spanner.v1.Type.toObject(message.type[j], options);
                                }
                                if (message.values && message.values.length) {
                                    object.values = [];
                                    for (var j = 0; j < message.values.length; ++j)
                                        object.values[j] = $root.google.spanner.executor.v1.ValueList.toObject(message.values[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this UpdateArgs to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            UpdateArgs.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for UpdateArgs
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.MutationAction.UpdateArgs
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            UpdateArgs.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.MutationAction.UpdateArgs";
                            };
    
                            return UpdateArgs;
                        })();
    
                        MutationAction.Mod = (function() {
    
                            /**
                             * Properties of a Mod.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @interface IMod
                             * @property {string|null} [table] Mod table
                             * @property {google.spanner.executor.v1.MutationAction.IInsertArgs|null} [insert] Mod insert
                             * @property {google.spanner.executor.v1.MutationAction.IUpdateArgs|null} [update] Mod update
                             * @property {google.spanner.executor.v1.MutationAction.IInsertArgs|null} [insertOrUpdate] Mod insertOrUpdate
                             * @property {google.spanner.executor.v1.MutationAction.IInsertArgs|null} [replace] Mod replace
                             * @property {google.spanner.executor.v1.IKeySet|null} [deleteKeys] Mod deleteKeys
                             */
    
                            /**
                             * Constructs a new Mod.
                             * @memberof google.spanner.executor.v1.MutationAction
                             * @classdesc Represents a Mod.
                             * @implements IMod
                             * @constructor
                             * @param {google.spanner.executor.v1.MutationAction.IMod=} [properties] Properties to set
                             */
                            function Mod(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Mod table.
                             * @member {string} table
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.table = "";
    
                            /**
                             * Mod insert.
                             * @member {google.spanner.executor.v1.MutationAction.IInsertArgs|null|undefined} insert
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.insert = null;
    
                            /**
                             * Mod update.
                             * @member {google.spanner.executor.v1.MutationAction.IUpdateArgs|null|undefined} update
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.update = null;
    
                            /**
                             * Mod insertOrUpdate.
                             * @member {google.spanner.executor.v1.MutationAction.IInsertArgs|null|undefined} insertOrUpdate
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.insertOrUpdate = null;
    
                            /**
                             * Mod replace.
                             * @member {google.spanner.executor.v1.MutationAction.IInsertArgs|null|undefined} replace
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.replace = null;
    
                            /**
                             * Mod deleteKeys.
                             * @member {google.spanner.executor.v1.IKeySet|null|undefined} deleteKeys
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             */
                            Mod.prototype.deleteKeys = null;
    
                            /**
                             * Creates a new Mod instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IMod=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.MutationAction.Mod} Mod instance
                             */
                            Mod.create = function create(properties) {
                                return new Mod(properties);
                            };
    
                            /**
                             * Encodes the specified Mod message. Does not implicitly {@link google.spanner.executor.v1.MutationAction.Mod.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                                if (message.insert != null && Object.hasOwnProperty.call(message, "insert"))
                                    $root.google.spanner.executor.v1.MutationAction.InsertArgs.encode(message.insert, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.update != null && Object.hasOwnProperty.call(message, "update"))
                                    $root.google.spanner.executor.v1.MutationAction.UpdateArgs.encode(message.update, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                if (message.insertOrUpdate != null && Object.hasOwnProperty.call(message, "insertOrUpdate"))
                                    $root.google.spanner.executor.v1.MutationAction.InsertArgs.encode(message.insertOrUpdate, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                                if (message.replace != null && Object.hasOwnProperty.call(message, "replace"))
                                    $root.google.spanner.executor.v1.MutationAction.InsertArgs.encode(message.replace, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                                if (message.deleteKeys != null && Object.hasOwnProperty.call(message, "deleteKeys"))
                                    $root.google.spanner.executor.v1.KeySet.encode(message.deleteKeys, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Mod message, length delimited. Does not implicitly {@link google.spanner.executor.v1.MutationAction.Mod.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.MutationAction.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.MutationAction.Mod();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.table = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.insert = $root.google.spanner.executor.v1.MutationAction.InsertArgs.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.update = $root.google.spanner.executor.v1.MutationAction.UpdateArgs.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 4: {
                                            message.insertOrUpdate = $root.google.spanner.executor.v1.MutationAction.InsertArgs.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 5: {
                                            message.replace = $root.google.spanner.executor.v1.MutationAction.InsertArgs.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 6: {
                                            message.deleteKeys = $root.google.spanner.executor.v1.KeySet.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.MutationAction.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Mod message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Mod.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.table != null && message.hasOwnProperty("table"))
                                    if (!$util.isString(message.table))
                                        return "table: string expected";
                                if (message.insert != null && message.hasOwnProperty("insert")) {
                                    var error = $root.google.spanner.executor.v1.MutationAction.InsertArgs.verify(message.insert);
                                    if (error)
                                        return "insert." + error;
                                }
                                if (message.update != null && message.hasOwnProperty("update")) {
                                    var error = $root.google.spanner.executor.v1.MutationAction.UpdateArgs.verify(message.update);
                                    if (error)
                                        return "update." + error;
                                }
                                if (message.insertOrUpdate != null && message.hasOwnProperty("insertOrUpdate")) {
                                    var error = $root.google.spanner.executor.v1.MutationAction.InsertArgs.verify(message.insertOrUpdate);
                                    if (error)
                                        return "insertOrUpdate." + error;
                                }
                                if (message.replace != null && message.hasOwnProperty("replace")) {
                                    var error = $root.google.spanner.executor.v1.MutationAction.InsertArgs.verify(message.replace);
                                    if (error)
                                        return "replace." + error;
                                }
                                if (message.deleteKeys != null && message.hasOwnProperty("deleteKeys")) {
                                    var error = $root.google.spanner.executor.v1.KeySet.verify(message.deleteKeys);
                                    if (error)
                                        return "deleteKeys." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a Mod message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.MutationAction.Mod} Mod
                             */
                            Mod.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.MutationAction.Mod)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.MutationAction.Mod();
                                if (object.table != null)
                                    message.table = String(object.table);
                                if (object.insert != null) {
                                    if (typeof object.insert !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.Mod.insert: object expected");
                                    message.insert = $root.google.spanner.executor.v1.MutationAction.InsertArgs.fromObject(object.insert);
                                }
                                if (object.update != null) {
                                    if (typeof object.update !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.Mod.update: object expected");
                                    message.update = $root.google.spanner.executor.v1.MutationAction.UpdateArgs.fromObject(object.update);
                                }
                                if (object.insertOrUpdate != null) {
                                    if (typeof object.insertOrUpdate !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.Mod.insertOrUpdate: object expected");
                                    message.insertOrUpdate = $root.google.spanner.executor.v1.MutationAction.InsertArgs.fromObject(object.insertOrUpdate);
                                }
                                if (object.replace != null) {
                                    if (typeof object.replace !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.Mod.replace: object expected");
                                    message.replace = $root.google.spanner.executor.v1.MutationAction.InsertArgs.fromObject(object.replace);
                                }
                                if (object.deleteKeys != null) {
                                    if (typeof object.deleteKeys !== "object")
                                        throw TypeError(".google.spanner.executor.v1.MutationAction.Mod.deleteKeys: object expected");
                                    message.deleteKeys = $root.google.spanner.executor.v1.KeySet.fromObject(object.deleteKeys);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Mod message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {google.spanner.executor.v1.MutationAction.Mod} message Mod
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Mod.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.table = "";
                                    object.insert = null;
                                    object.update = null;
                                    object.insertOrUpdate = null;
                                    object.replace = null;
                                    object.deleteKeys = null;
                                }
                                if (message.table != null && message.hasOwnProperty("table"))
                                    object.table = message.table;
                                if (message.insert != null && message.hasOwnProperty("insert"))
                                    object.insert = $root.google.spanner.executor.v1.MutationAction.InsertArgs.toObject(message.insert, options);
                                if (message.update != null && message.hasOwnProperty("update"))
                                    object.update = $root.google.spanner.executor.v1.MutationAction.UpdateArgs.toObject(message.update, options);
                                if (message.insertOrUpdate != null && message.hasOwnProperty("insertOrUpdate"))
                                    object.insertOrUpdate = $root.google.spanner.executor.v1.MutationAction.InsertArgs.toObject(message.insertOrUpdate, options);
                                if (message.replace != null && message.hasOwnProperty("replace"))
                                    object.replace = $root.google.spanner.executor.v1.MutationAction.InsertArgs.toObject(message.replace, options);
                                if (message.deleteKeys != null && message.hasOwnProperty("deleteKeys"))
                                    object.deleteKeys = $root.google.spanner.executor.v1.KeySet.toObject(message.deleteKeys, options);
                                return object;
                            };
    
                            /**
                             * Converts this Mod to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Mod.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Mod
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.MutationAction.Mod
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Mod.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.MutationAction.Mod";
                            };
    
                            return Mod;
                        })();
    
                        return MutationAction;
                    })();
    
                    v1.WriteMutationsAction = (function() {
    
                        /**
                         * Properties of a WriteMutationsAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IWriteMutationsAction
                         * @property {google.spanner.executor.v1.IMutationAction|null} [mutation] WriteMutationsAction mutation
                         */
    
                        /**
                         * Constructs a new WriteMutationsAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a WriteMutationsAction.
                         * @implements IWriteMutationsAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IWriteMutationsAction=} [properties] Properties to set
                         */
                        function WriteMutationsAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * WriteMutationsAction mutation.
                         * @member {google.spanner.executor.v1.IMutationAction|null|undefined} mutation
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @instance
                         */
                        WriteMutationsAction.prototype.mutation = null;
    
                        /**
                         * Creates a new WriteMutationsAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IWriteMutationsAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.WriteMutationsAction} WriteMutationsAction instance
                         */
                        WriteMutationsAction.create = function create(properties) {
                            return new WriteMutationsAction(properties);
                        };
    
                        /**
                         * Encodes the specified WriteMutationsAction message. Does not implicitly {@link google.spanner.executor.v1.WriteMutationsAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IWriteMutationsAction} message WriteMutationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        WriteMutationsAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.mutation != null && Object.hasOwnProperty.call(message, "mutation"))
                                $root.google.spanner.executor.v1.MutationAction.encode(message.mutation, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified WriteMutationsAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.WriteMutationsAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IWriteMutationsAction} message WriteMutationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        WriteMutationsAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a WriteMutationsAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.WriteMutationsAction} WriteMutationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        WriteMutationsAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.WriteMutationsAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.mutation = $root.google.spanner.executor.v1.MutationAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a WriteMutationsAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.WriteMutationsAction} WriteMutationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        WriteMutationsAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a WriteMutationsAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        WriteMutationsAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.mutation != null && message.hasOwnProperty("mutation")) {
                                var error = $root.google.spanner.executor.v1.MutationAction.verify(message.mutation);
                                if (error)
                                    return "mutation." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a WriteMutationsAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.WriteMutationsAction} WriteMutationsAction
                         */
                        WriteMutationsAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.WriteMutationsAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.WriteMutationsAction();
                            if (object.mutation != null) {
                                if (typeof object.mutation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.WriteMutationsAction.mutation: object expected");
                                message.mutation = $root.google.spanner.executor.v1.MutationAction.fromObject(object.mutation);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a WriteMutationsAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {google.spanner.executor.v1.WriteMutationsAction} message WriteMutationsAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        WriteMutationsAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.mutation = null;
                            if (message.mutation != null && message.hasOwnProperty("mutation"))
                                object.mutation = $root.google.spanner.executor.v1.MutationAction.toObject(message.mutation, options);
                            return object;
                        };
    
                        /**
                         * Converts this WriteMutationsAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        WriteMutationsAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for WriteMutationsAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.WriteMutationsAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        WriteMutationsAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.WriteMutationsAction";
                        };
    
                        return WriteMutationsAction;
                    })();
    
                    v1.PartitionedUpdateAction = (function() {
    
                        /**
                         * Properties of a PartitionedUpdateAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IPartitionedUpdateAction
                         * @property {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions|null} [options] PartitionedUpdateAction options
                         * @property {google.spanner.executor.v1.IQueryAction|null} [update] PartitionedUpdateAction update
                         */
    
                        /**
                         * Constructs a new PartitionedUpdateAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a PartitionedUpdateAction.
                         * @implements IPartitionedUpdateAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IPartitionedUpdateAction=} [properties] Properties to set
                         */
                        function PartitionedUpdateAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * PartitionedUpdateAction options.
                         * @member {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions|null|undefined} options
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @instance
                         */
                        PartitionedUpdateAction.prototype.options = null;
    
                        /**
                         * PartitionedUpdateAction update.
                         * @member {google.spanner.executor.v1.IQueryAction|null|undefined} update
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @instance
                         */
                        PartitionedUpdateAction.prototype.update = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(PartitionedUpdateAction.prototype, "_options", {
                            get: $util.oneOfGetter($oneOfFields = ["options"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new PartitionedUpdateAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {google.spanner.executor.v1.IPartitionedUpdateAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.PartitionedUpdateAction} PartitionedUpdateAction instance
                         */
                        PartitionedUpdateAction.create = function create(properties) {
                            return new PartitionedUpdateAction(properties);
                        };
    
                        /**
                         * Encodes the specified PartitionedUpdateAction message. Does not implicitly {@link google.spanner.executor.v1.PartitionedUpdateAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {google.spanner.executor.v1.IPartitionedUpdateAction} message PartitionedUpdateAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionedUpdateAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                                $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.encode(message.options, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.update != null && Object.hasOwnProperty.call(message, "update"))
                                $root.google.spanner.executor.v1.QueryAction.encode(message.update, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified PartitionedUpdateAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.PartitionedUpdateAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {google.spanner.executor.v1.IPartitionedUpdateAction} message PartitionedUpdateAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionedUpdateAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a PartitionedUpdateAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.PartitionedUpdateAction} PartitionedUpdateAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionedUpdateAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.PartitionedUpdateAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.options = $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.update = $root.google.spanner.executor.v1.QueryAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a PartitionedUpdateAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.PartitionedUpdateAction} PartitionedUpdateAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionedUpdateAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a PartitionedUpdateAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        PartitionedUpdateAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.options != null && message.hasOwnProperty("options")) {
                                properties._options = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.verify(message.options);
                                    if (error)
                                        return "options." + error;
                                }
                            }
                            if (message.update != null && message.hasOwnProperty("update")) {
                                var error = $root.google.spanner.executor.v1.QueryAction.verify(message.update);
                                if (error)
                                    return "update." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a PartitionedUpdateAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.PartitionedUpdateAction} PartitionedUpdateAction
                         */
                        PartitionedUpdateAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.PartitionedUpdateAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.PartitionedUpdateAction();
                            if (object.options != null) {
                                if (typeof object.options !== "object")
                                    throw TypeError(".google.spanner.executor.v1.PartitionedUpdateAction.options: object expected");
                                message.options = $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.fromObject(object.options);
                            }
                            if (object.update != null) {
                                if (typeof object.update !== "object")
                                    throw TypeError(".google.spanner.executor.v1.PartitionedUpdateAction.update: object expected");
                                message.update = $root.google.spanner.executor.v1.QueryAction.fromObject(object.update);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a PartitionedUpdateAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {google.spanner.executor.v1.PartitionedUpdateAction} message PartitionedUpdateAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        PartitionedUpdateAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.update = null;
                            if (message.options != null && message.hasOwnProperty("options")) {
                                object.options = $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.toObject(message.options, options);
                                if (options.oneofs)
                                    object._options = "options";
                            }
                            if (message.update != null && message.hasOwnProperty("update"))
                                object.update = $root.google.spanner.executor.v1.QueryAction.toObject(message.update, options);
                            return object;
                        };
    
                        /**
                         * Converts this PartitionedUpdateAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        PartitionedUpdateAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for PartitionedUpdateAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        PartitionedUpdateAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.PartitionedUpdateAction";
                        };
    
                        PartitionedUpdateAction.ExecutePartitionedUpdateOptions = (function() {
    
                            /**
                             * Properties of an ExecutePartitionedUpdateOptions.
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                             * @interface IExecutePartitionedUpdateOptions
                             * @property {google.spanner.v1.RequestOptions.Priority|null} [rpcPriority] ExecutePartitionedUpdateOptions rpcPriority
                             * @property {string|null} [tag] ExecutePartitionedUpdateOptions tag
                             */
    
                            /**
                             * Constructs a new ExecutePartitionedUpdateOptions.
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction
                             * @classdesc Represents an ExecutePartitionedUpdateOptions.
                             * @implements IExecutePartitionedUpdateOptions
                             * @constructor
                             * @param {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions=} [properties] Properties to set
                             */
                            function ExecutePartitionedUpdateOptions(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ExecutePartitionedUpdateOptions rpcPriority.
                             * @member {google.spanner.v1.RequestOptions.Priority|null|undefined} rpcPriority
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @instance
                             */
                            ExecutePartitionedUpdateOptions.prototype.rpcPriority = null;
    
                            /**
                             * ExecutePartitionedUpdateOptions tag.
                             * @member {string|null|undefined} tag
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @instance
                             */
                            ExecutePartitionedUpdateOptions.prototype.tag = null;
    
                            // OneOf field names bound to virtual getters and setters
                            var $oneOfFields;
    
                            // Virtual OneOf for proto3 optional field
                            Object.defineProperty(ExecutePartitionedUpdateOptions.prototype, "_rpcPriority", {
                                get: $util.oneOfGetter($oneOfFields = ["rpcPriority"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            // Virtual OneOf for proto3 optional field
                            Object.defineProperty(ExecutePartitionedUpdateOptions.prototype, "_tag", {
                                get: $util.oneOfGetter($oneOfFields = ["tag"]),
                                set: $util.oneOfSetter($oneOfFields)
                            });
    
                            /**
                             * Creates a new ExecutePartitionedUpdateOptions instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions} ExecutePartitionedUpdateOptions instance
                             */
                            ExecutePartitionedUpdateOptions.create = function create(properties) {
                                return new ExecutePartitionedUpdateOptions(properties);
                            };
    
                            /**
                             * Encodes the specified ExecutePartitionedUpdateOptions message. Does not implicitly {@link google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions} message ExecutePartitionedUpdateOptions message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ExecutePartitionedUpdateOptions.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.rpcPriority != null && Object.hasOwnProperty.call(message, "rpcPriority"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.rpcPriority);
                                if (message.tag != null && Object.hasOwnProperty.call(message, "tag"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.tag);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ExecutePartitionedUpdateOptions message, length delimited. Does not implicitly {@link google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {google.spanner.executor.v1.PartitionedUpdateAction.IExecutePartitionedUpdateOptions} message ExecutePartitionedUpdateOptions message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ExecutePartitionedUpdateOptions.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes an ExecutePartitionedUpdateOptions message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions} ExecutePartitionedUpdateOptions
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ExecutePartitionedUpdateOptions.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.rpcPriority = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.tag = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes an ExecutePartitionedUpdateOptions message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions} ExecutePartitionedUpdateOptions
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ExecutePartitionedUpdateOptions.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies an ExecutePartitionedUpdateOptions message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ExecutePartitionedUpdateOptions.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                var properties = {};
                                if (message.rpcPriority != null && message.hasOwnProperty("rpcPriority")) {
                                    properties._rpcPriority = 1;
                                    switch (message.rpcPriority) {
                                    default:
                                        return "rpcPriority: enum value expected";
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        break;
                                    }
                                }
                                if (message.tag != null && message.hasOwnProperty("tag")) {
                                    properties._tag = 1;
                                    if (!$util.isString(message.tag))
                                        return "tag: string expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates an ExecutePartitionedUpdateOptions message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions} ExecutePartitionedUpdateOptions
                             */
                            ExecutePartitionedUpdateOptions.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions();
                                switch (object.rpcPriority) {
                                default:
                                    if (typeof object.rpcPriority === "number") {
                                        message.rpcPriority = object.rpcPriority;
                                        break;
                                    }
                                    break;
                                case "PRIORITY_UNSPECIFIED":
                                case 0:
                                    message.rpcPriority = 0;
                                    break;
                                case "PRIORITY_LOW":
                                case 1:
                                    message.rpcPriority = 1;
                                    break;
                                case "PRIORITY_MEDIUM":
                                case 2:
                                    message.rpcPriority = 2;
                                    break;
                                case "PRIORITY_HIGH":
                                case 3:
                                    message.rpcPriority = 3;
                                    break;
                                }
                                if (object.tag != null)
                                    message.tag = String(object.tag);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from an ExecutePartitionedUpdateOptions message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions} message ExecutePartitionedUpdateOptions
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ExecutePartitionedUpdateOptions.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (message.rpcPriority != null && message.hasOwnProperty("rpcPriority")) {
                                    object.rpcPriority = options.enums === String ? $root.google.spanner.v1.RequestOptions.Priority[message.rpcPriority] === undefined ? message.rpcPriority : $root.google.spanner.v1.RequestOptions.Priority[message.rpcPriority] : message.rpcPriority;
                                    if (options.oneofs)
                                        object._rpcPriority = "rpcPriority";
                                }
                                if (message.tag != null && message.hasOwnProperty("tag")) {
                                    object.tag = message.tag;
                                    if (options.oneofs)
                                        object._tag = "tag";
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ExecutePartitionedUpdateOptions to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ExecutePartitionedUpdateOptions.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ExecutePartitionedUpdateOptions
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ExecutePartitionedUpdateOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.PartitionedUpdateAction.ExecutePartitionedUpdateOptions";
                            };
    
                            return ExecutePartitionedUpdateOptions;
                        })();
    
                        return PartitionedUpdateAction;
                    })();
    
                    v1.StartTransactionAction = (function() {
    
                        /**
                         * Properties of a StartTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IStartTransactionAction
                         * @property {google.spanner.executor.v1.IConcurrency|null} [concurrency] StartTransactionAction concurrency
                         * @property {Array.<google.spanner.executor.v1.ITableMetadata>|null} [table] StartTransactionAction table
                         * @property {string|null} [transactionSeed] StartTransactionAction transactionSeed
                         * @property {google.spanner.executor.v1.ITransactionExecutionOptions|null} [executionOptions] StartTransactionAction executionOptions
                         */
    
                        /**
                         * Constructs a new StartTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a StartTransactionAction.
                         * @implements IStartTransactionAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IStartTransactionAction=} [properties] Properties to set
                         */
                        function StartTransactionAction(properties) {
                            this.table = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * StartTransactionAction concurrency.
                         * @member {google.spanner.executor.v1.IConcurrency|null|undefined} concurrency
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @instance
                         */
                        StartTransactionAction.prototype.concurrency = null;
    
                        /**
                         * StartTransactionAction table.
                         * @member {Array.<google.spanner.executor.v1.ITableMetadata>} table
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @instance
                         */
                        StartTransactionAction.prototype.table = $util.emptyArray;
    
                        /**
                         * StartTransactionAction transactionSeed.
                         * @member {string} transactionSeed
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @instance
                         */
                        StartTransactionAction.prototype.transactionSeed = "";
    
                        /**
                         * StartTransactionAction executionOptions.
                         * @member {google.spanner.executor.v1.ITransactionExecutionOptions|null|undefined} executionOptions
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @instance
                         */
                        StartTransactionAction.prototype.executionOptions = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(StartTransactionAction.prototype, "_concurrency", {
                            get: $util.oneOfGetter($oneOfFields = ["concurrency"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(StartTransactionAction.prototype, "_executionOptions", {
                            get: $util.oneOfGetter($oneOfFields = ["executionOptions"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new StartTransactionAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartTransactionAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.StartTransactionAction} StartTransactionAction instance
                         */
                        StartTransactionAction.create = function create(properties) {
                            return new StartTransactionAction(properties);
                        };
    
                        /**
                         * Encodes the specified StartTransactionAction message. Does not implicitly {@link google.spanner.executor.v1.StartTransactionAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartTransactionAction} message StartTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        StartTransactionAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.concurrency != null && Object.hasOwnProperty.call(message, "concurrency"))
                                $root.google.spanner.executor.v1.Concurrency.encode(message.concurrency, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.table != null && message.table.length)
                                for (var i = 0; i < message.table.length; ++i)
                                    $root.google.spanner.executor.v1.TableMetadata.encode(message.table[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.transactionSeed != null && Object.hasOwnProperty.call(message, "transactionSeed"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.transactionSeed);
                            if (message.executionOptions != null && Object.hasOwnProperty.call(message, "executionOptions"))
                                $root.google.spanner.executor.v1.TransactionExecutionOptions.encode(message.executionOptions, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified StartTransactionAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.StartTransactionAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartTransactionAction} message StartTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        StartTransactionAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a StartTransactionAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.StartTransactionAction} StartTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        StartTransactionAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.StartTransactionAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.concurrency = $root.google.spanner.executor.v1.Concurrency.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        if (!(message.table && message.table.length))
                                            message.table = [];
                                        message.table.push($root.google.spanner.executor.v1.TableMetadata.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        message.transactionSeed = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.executionOptions = $root.google.spanner.executor.v1.TransactionExecutionOptions.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a StartTransactionAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.StartTransactionAction} StartTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        StartTransactionAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a StartTransactionAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        StartTransactionAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.concurrency != null && message.hasOwnProperty("concurrency")) {
                                properties._concurrency = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.Concurrency.verify(message.concurrency);
                                    if (error)
                                        return "concurrency." + error;
                                }
                            }
                            if (message.table != null && message.hasOwnProperty("table")) {
                                if (!Array.isArray(message.table))
                                    return "table: array expected";
                                for (var i = 0; i < message.table.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.TableMetadata.verify(message.table[i]);
                                    if (error)
                                        return "table." + error;
                                }
                            }
                            if (message.transactionSeed != null && message.hasOwnProperty("transactionSeed"))
                                if (!$util.isString(message.transactionSeed))
                                    return "transactionSeed: string expected";
                            if (message.executionOptions != null && message.hasOwnProperty("executionOptions")) {
                                properties._executionOptions = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.TransactionExecutionOptions.verify(message.executionOptions);
                                    if (error)
                                        return "executionOptions." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a StartTransactionAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.StartTransactionAction} StartTransactionAction
                         */
                        StartTransactionAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.StartTransactionAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.StartTransactionAction();
                            if (object.concurrency != null) {
                                if (typeof object.concurrency !== "object")
                                    throw TypeError(".google.spanner.executor.v1.StartTransactionAction.concurrency: object expected");
                                message.concurrency = $root.google.spanner.executor.v1.Concurrency.fromObject(object.concurrency);
                            }
                            if (object.table) {
                                if (!Array.isArray(object.table))
                                    throw TypeError(".google.spanner.executor.v1.StartTransactionAction.table: array expected");
                                message.table = [];
                                for (var i = 0; i < object.table.length; ++i) {
                                    if (typeof object.table[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.StartTransactionAction.table: object expected");
                                    message.table[i] = $root.google.spanner.executor.v1.TableMetadata.fromObject(object.table[i]);
                                }
                            }
                            if (object.transactionSeed != null)
                                message.transactionSeed = String(object.transactionSeed);
                            if (object.executionOptions != null) {
                                if (typeof object.executionOptions !== "object")
                                    throw TypeError(".google.spanner.executor.v1.StartTransactionAction.executionOptions: object expected");
                                message.executionOptions = $root.google.spanner.executor.v1.TransactionExecutionOptions.fromObject(object.executionOptions);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a StartTransactionAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.StartTransactionAction} message StartTransactionAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        StartTransactionAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.table = [];
                            if (options.defaults)
                                object.transactionSeed = "";
                            if (message.concurrency != null && message.hasOwnProperty("concurrency")) {
                                object.concurrency = $root.google.spanner.executor.v1.Concurrency.toObject(message.concurrency, options);
                                if (options.oneofs)
                                    object._concurrency = "concurrency";
                            }
                            if (message.table && message.table.length) {
                                object.table = [];
                                for (var j = 0; j < message.table.length; ++j)
                                    object.table[j] = $root.google.spanner.executor.v1.TableMetadata.toObject(message.table[j], options);
                            }
                            if (message.transactionSeed != null && message.hasOwnProperty("transactionSeed"))
                                object.transactionSeed = message.transactionSeed;
                            if (message.executionOptions != null && message.hasOwnProperty("executionOptions")) {
                                object.executionOptions = $root.google.spanner.executor.v1.TransactionExecutionOptions.toObject(message.executionOptions, options);
                                if (options.oneofs)
                                    object._executionOptions = "executionOptions";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this StartTransactionAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        StartTransactionAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for StartTransactionAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.StartTransactionAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        StartTransactionAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.StartTransactionAction";
                        };
    
                        return StartTransactionAction;
                    })();
    
                    v1.Concurrency = (function() {
    
                        /**
                         * Properties of a Concurrency.
                         * @memberof google.spanner.executor.v1
                         * @interface IConcurrency
                         * @property {number|null} [stalenessSeconds] Concurrency stalenessSeconds
                         * @property {number|Long|null} [minReadTimestampMicros] Concurrency minReadTimestampMicros
                         * @property {number|null} [maxStalenessSeconds] Concurrency maxStalenessSeconds
                         * @property {number|Long|null} [exactTimestampMicros] Concurrency exactTimestampMicros
                         * @property {boolean|null} [strong] Concurrency strong
                         * @property {boolean|null} [batch] Concurrency batch
                         * @property {boolean|null} [snapshotEpochRead] Concurrency snapshotEpochRead
                         * @property {string|null} [snapshotEpochRootTable] Concurrency snapshotEpochRootTable
                         * @property {number|Long|null} [batchReadTimestampMicros] Concurrency batchReadTimestampMicros
                         */
    
                        /**
                         * Constructs a new Concurrency.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a Concurrency.
                         * @implements IConcurrency
                         * @constructor
                         * @param {google.spanner.executor.v1.IConcurrency=} [properties] Properties to set
                         */
                        function Concurrency(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Concurrency stalenessSeconds.
                         * @member {number|null|undefined} stalenessSeconds
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.stalenessSeconds = null;
    
                        /**
                         * Concurrency minReadTimestampMicros.
                         * @member {number|Long|null|undefined} minReadTimestampMicros
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.minReadTimestampMicros = null;
    
                        /**
                         * Concurrency maxStalenessSeconds.
                         * @member {number|null|undefined} maxStalenessSeconds
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.maxStalenessSeconds = null;
    
                        /**
                         * Concurrency exactTimestampMicros.
                         * @member {number|Long|null|undefined} exactTimestampMicros
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.exactTimestampMicros = null;
    
                        /**
                         * Concurrency strong.
                         * @member {boolean|null|undefined} strong
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.strong = null;
    
                        /**
                         * Concurrency batch.
                         * @member {boolean|null|undefined} batch
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.batch = null;
    
                        /**
                         * Concurrency snapshotEpochRead.
                         * @member {boolean} snapshotEpochRead
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.snapshotEpochRead = false;
    
                        /**
                         * Concurrency snapshotEpochRootTable.
                         * @member {string} snapshotEpochRootTable
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.snapshotEpochRootTable = "";
    
                        /**
                         * Concurrency batchReadTimestampMicros.
                         * @member {number|Long} batchReadTimestampMicros
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Concurrency.prototype.batchReadTimestampMicros = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * Concurrency concurrencyMode.
                         * @member {"stalenessSeconds"|"minReadTimestampMicros"|"maxStalenessSeconds"|"exactTimestampMicros"|"strong"|"batch"|undefined} concurrencyMode
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         */
                        Object.defineProperty(Concurrency.prototype, "concurrencyMode", {
                            get: $util.oneOfGetter($oneOfFields = ["stalenessSeconds", "minReadTimestampMicros", "maxStalenessSeconds", "exactTimestampMicros", "strong", "batch"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new Concurrency instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {google.spanner.executor.v1.IConcurrency=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.Concurrency} Concurrency instance
                         */
                        Concurrency.create = function create(properties) {
                            return new Concurrency(properties);
                        };
    
                        /**
                         * Encodes the specified Concurrency message. Does not implicitly {@link google.spanner.executor.v1.Concurrency.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {google.spanner.executor.v1.IConcurrency} message Concurrency message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Concurrency.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.stalenessSeconds != null && Object.hasOwnProperty.call(message, "stalenessSeconds"))
                                writer.uint32(/* id 1, wireType 1 =*/9).double(message.stalenessSeconds);
                            if (message.minReadTimestampMicros != null && Object.hasOwnProperty.call(message, "minReadTimestampMicros"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int64(message.minReadTimestampMicros);
                            if (message.maxStalenessSeconds != null && Object.hasOwnProperty.call(message, "maxStalenessSeconds"))
                                writer.uint32(/* id 3, wireType 1 =*/25).double(message.maxStalenessSeconds);
                            if (message.exactTimestampMicros != null && Object.hasOwnProperty.call(message, "exactTimestampMicros"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int64(message.exactTimestampMicros);
                            if (message.strong != null && Object.hasOwnProperty.call(message, "strong"))
                                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.strong);
                            if (message.batch != null && Object.hasOwnProperty.call(message, "batch"))
                                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.batch);
                            if (message.snapshotEpochRead != null && Object.hasOwnProperty.call(message, "snapshotEpochRead"))
                                writer.uint32(/* id 7, wireType 0 =*/56).bool(message.snapshotEpochRead);
                            if (message.snapshotEpochRootTable != null && Object.hasOwnProperty.call(message, "snapshotEpochRootTable"))
                                writer.uint32(/* id 8, wireType 2 =*/66).string(message.snapshotEpochRootTable);
                            if (message.batchReadTimestampMicros != null && Object.hasOwnProperty.call(message, "batchReadTimestampMicros"))
                                writer.uint32(/* id 9, wireType 0 =*/72).int64(message.batchReadTimestampMicros);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Concurrency message, length delimited. Does not implicitly {@link google.spanner.executor.v1.Concurrency.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {google.spanner.executor.v1.IConcurrency} message Concurrency message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Concurrency.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Concurrency message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.Concurrency} Concurrency
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Concurrency.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.Concurrency();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.stalenessSeconds = reader.double();
                                        break;
                                    }
                                case 2: {
                                        message.minReadTimestampMicros = reader.int64();
                                        break;
                                    }
                                case 3: {
                                        message.maxStalenessSeconds = reader.double();
                                        break;
                                    }
                                case 4: {
                                        message.exactTimestampMicros = reader.int64();
                                        break;
                                    }
                                case 5: {
                                        message.strong = reader.bool();
                                        break;
                                    }
                                case 6: {
                                        message.batch = reader.bool();
                                        break;
                                    }
                                case 7: {
                                        message.snapshotEpochRead = reader.bool();
                                        break;
                                    }
                                case 8: {
                                        message.snapshotEpochRootTable = reader.string();
                                        break;
                                    }
                                case 9: {
                                        message.batchReadTimestampMicros = reader.int64();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Concurrency message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.Concurrency} Concurrency
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Concurrency.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Concurrency message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Concurrency.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.stalenessSeconds != null && message.hasOwnProperty("stalenessSeconds")) {
                                properties.concurrencyMode = 1;
                                if (typeof message.stalenessSeconds !== "number")
                                    return "stalenessSeconds: number expected";
                            }
                            if (message.minReadTimestampMicros != null && message.hasOwnProperty("minReadTimestampMicros")) {
                                if (properties.concurrencyMode === 1)
                                    return "concurrencyMode: multiple values";
                                properties.concurrencyMode = 1;
                                if (!$util.isInteger(message.minReadTimestampMicros) && !(message.minReadTimestampMicros && $util.isInteger(message.minReadTimestampMicros.low) && $util.isInteger(message.minReadTimestampMicros.high)))
                                    return "minReadTimestampMicros: integer|Long expected";
                            }
                            if (message.maxStalenessSeconds != null && message.hasOwnProperty("maxStalenessSeconds")) {
                                if (properties.concurrencyMode === 1)
                                    return "concurrencyMode: multiple values";
                                properties.concurrencyMode = 1;
                                if (typeof message.maxStalenessSeconds !== "number")
                                    return "maxStalenessSeconds: number expected";
                            }
                            if (message.exactTimestampMicros != null && message.hasOwnProperty("exactTimestampMicros")) {
                                if (properties.concurrencyMode === 1)
                                    return "concurrencyMode: multiple values";
                                properties.concurrencyMode = 1;
                                if (!$util.isInteger(message.exactTimestampMicros) && !(message.exactTimestampMicros && $util.isInteger(message.exactTimestampMicros.low) && $util.isInteger(message.exactTimestampMicros.high)))
                                    return "exactTimestampMicros: integer|Long expected";
                            }
                            if (message.strong != null && message.hasOwnProperty("strong")) {
                                if (properties.concurrencyMode === 1)
                                    return "concurrencyMode: multiple values";
                                properties.concurrencyMode = 1;
                                if (typeof message.strong !== "boolean")
                                    return "strong: boolean expected";
                            }
                            if (message.batch != null && message.hasOwnProperty("batch")) {
                                if (properties.concurrencyMode === 1)
                                    return "concurrencyMode: multiple values";
                                properties.concurrencyMode = 1;
                                if (typeof message.batch !== "boolean")
                                    return "batch: boolean expected";
                            }
                            if (message.snapshotEpochRead != null && message.hasOwnProperty("snapshotEpochRead"))
                                if (typeof message.snapshotEpochRead !== "boolean")
                                    return "snapshotEpochRead: boolean expected";
                            if (message.snapshotEpochRootTable != null && message.hasOwnProperty("snapshotEpochRootTable"))
                                if (!$util.isString(message.snapshotEpochRootTable))
                                    return "snapshotEpochRootTable: string expected";
                            if (message.batchReadTimestampMicros != null && message.hasOwnProperty("batchReadTimestampMicros"))
                                if (!$util.isInteger(message.batchReadTimestampMicros) && !(message.batchReadTimestampMicros && $util.isInteger(message.batchReadTimestampMicros.low) && $util.isInteger(message.batchReadTimestampMicros.high)))
                                    return "batchReadTimestampMicros: integer|Long expected";
                            return null;
                        };
    
                        /**
                         * Creates a Concurrency message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.Concurrency} Concurrency
                         */
                        Concurrency.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.Concurrency)
                                return object;
                            var message = new $root.google.spanner.executor.v1.Concurrency();
                            if (object.stalenessSeconds != null)
                                message.stalenessSeconds = Number(object.stalenessSeconds);
                            if (object.minReadTimestampMicros != null)
                                if ($util.Long)
                                    (message.minReadTimestampMicros = $util.Long.fromValue(object.minReadTimestampMicros)).unsigned = false;
                                else if (typeof object.minReadTimestampMicros === "string")
                                    message.minReadTimestampMicros = parseInt(object.minReadTimestampMicros, 10);
                                else if (typeof object.minReadTimestampMicros === "number")
                                    message.minReadTimestampMicros = object.minReadTimestampMicros;
                                else if (typeof object.minReadTimestampMicros === "object")
                                    message.minReadTimestampMicros = new $util.LongBits(object.minReadTimestampMicros.low >>> 0, object.minReadTimestampMicros.high >>> 0).toNumber();
                            if (object.maxStalenessSeconds != null)
                                message.maxStalenessSeconds = Number(object.maxStalenessSeconds);
                            if (object.exactTimestampMicros != null)
                                if ($util.Long)
                                    (message.exactTimestampMicros = $util.Long.fromValue(object.exactTimestampMicros)).unsigned = false;
                                else if (typeof object.exactTimestampMicros === "string")
                                    message.exactTimestampMicros = parseInt(object.exactTimestampMicros, 10);
                                else if (typeof object.exactTimestampMicros === "number")
                                    message.exactTimestampMicros = object.exactTimestampMicros;
                                else if (typeof object.exactTimestampMicros === "object")
                                    message.exactTimestampMicros = new $util.LongBits(object.exactTimestampMicros.low >>> 0, object.exactTimestampMicros.high >>> 0).toNumber();
                            if (object.strong != null)
                                message.strong = Boolean(object.strong);
                            if (object.batch != null)
                                message.batch = Boolean(object.batch);
                            if (object.snapshotEpochRead != null)
                                message.snapshotEpochRead = Boolean(object.snapshotEpochRead);
                            if (object.snapshotEpochRootTable != null)
                                message.snapshotEpochRootTable = String(object.snapshotEpochRootTable);
                            if (object.batchReadTimestampMicros != null)
                                if ($util.Long)
                                    (message.batchReadTimestampMicros = $util.Long.fromValue(object.batchReadTimestampMicros)).unsigned = false;
                                else if (typeof object.batchReadTimestampMicros === "string")
                                    message.batchReadTimestampMicros = parseInt(object.batchReadTimestampMicros, 10);
                                else if (typeof object.batchReadTimestampMicros === "number")
                                    message.batchReadTimestampMicros = object.batchReadTimestampMicros;
                                else if (typeof object.batchReadTimestampMicros === "object")
                                    message.batchReadTimestampMicros = new $util.LongBits(object.batchReadTimestampMicros.low >>> 0, object.batchReadTimestampMicros.high >>> 0).toNumber();
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Concurrency message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {google.spanner.executor.v1.Concurrency} message Concurrency
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Concurrency.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.snapshotEpochRead = false;
                                object.snapshotEpochRootTable = "";
                                if ($util.Long) {
                                    var long = new $util.Long(0, 0, false);
                                    object.batchReadTimestampMicros = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                } else
                                    object.batchReadTimestampMicros = options.longs === String ? "0" : 0;
                            }
                            if (message.stalenessSeconds != null && message.hasOwnProperty("stalenessSeconds")) {
                                object.stalenessSeconds = options.json && !isFinite(message.stalenessSeconds) ? String(message.stalenessSeconds) : message.stalenessSeconds;
                                if (options.oneofs)
                                    object.concurrencyMode = "stalenessSeconds";
                            }
                            if (message.minReadTimestampMicros != null && message.hasOwnProperty("minReadTimestampMicros")) {
                                if (typeof message.minReadTimestampMicros === "number")
                                    object.minReadTimestampMicros = options.longs === String ? String(message.minReadTimestampMicros) : message.minReadTimestampMicros;
                                else
                                    object.minReadTimestampMicros = options.longs === String ? $util.Long.prototype.toString.call(message.minReadTimestampMicros) : options.longs === Number ? new $util.LongBits(message.minReadTimestampMicros.low >>> 0, message.minReadTimestampMicros.high >>> 0).toNumber() : message.minReadTimestampMicros;
                                if (options.oneofs)
                                    object.concurrencyMode = "minReadTimestampMicros";
                            }
                            if (message.maxStalenessSeconds != null && message.hasOwnProperty("maxStalenessSeconds")) {
                                object.maxStalenessSeconds = options.json && !isFinite(message.maxStalenessSeconds) ? String(message.maxStalenessSeconds) : message.maxStalenessSeconds;
                                if (options.oneofs)
                                    object.concurrencyMode = "maxStalenessSeconds";
                            }
                            if (message.exactTimestampMicros != null && message.hasOwnProperty("exactTimestampMicros")) {
                                if (typeof message.exactTimestampMicros === "number")
                                    object.exactTimestampMicros = options.longs === String ? String(message.exactTimestampMicros) : message.exactTimestampMicros;
                                else
                                    object.exactTimestampMicros = options.longs === String ? $util.Long.prototype.toString.call(message.exactTimestampMicros) : options.longs === Number ? new $util.LongBits(message.exactTimestampMicros.low >>> 0, message.exactTimestampMicros.high >>> 0).toNumber() : message.exactTimestampMicros;
                                if (options.oneofs)
                                    object.concurrencyMode = "exactTimestampMicros";
                            }
                            if (message.strong != null && message.hasOwnProperty("strong")) {
                                object.strong = message.strong;
                                if (options.oneofs)
                                    object.concurrencyMode = "strong";
                            }
                            if (message.batch != null && message.hasOwnProperty("batch")) {
                                object.batch = message.batch;
                                if (options.oneofs)
                                    object.concurrencyMode = "batch";
                            }
                            if (message.snapshotEpochRead != null && message.hasOwnProperty("snapshotEpochRead"))
                                object.snapshotEpochRead = message.snapshotEpochRead;
                            if (message.snapshotEpochRootTable != null && message.hasOwnProperty("snapshotEpochRootTable"))
                                object.snapshotEpochRootTable = message.snapshotEpochRootTable;
                            if (message.batchReadTimestampMicros != null && message.hasOwnProperty("batchReadTimestampMicros"))
                                if (typeof message.batchReadTimestampMicros === "number")
                                    object.batchReadTimestampMicros = options.longs === String ? String(message.batchReadTimestampMicros) : message.batchReadTimestampMicros;
                                else
                                    object.batchReadTimestampMicros = options.longs === String ? $util.Long.prototype.toString.call(message.batchReadTimestampMicros) : options.longs === Number ? new $util.LongBits(message.batchReadTimestampMicros.low >>> 0, message.batchReadTimestampMicros.high >>> 0).toNumber() : message.batchReadTimestampMicros;
                            return object;
                        };
    
                        /**
                         * Converts this Concurrency to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Concurrency.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Concurrency
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.Concurrency
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Concurrency.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.Concurrency";
                        };
    
                        return Concurrency;
                    })();
    
                    v1.TableMetadata = (function() {
    
                        /**
                         * Properties of a TableMetadata.
                         * @memberof google.spanner.executor.v1
                         * @interface ITableMetadata
                         * @property {string|null} [name] TableMetadata name
                         * @property {Array.<google.spanner.executor.v1.IColumnMetadata>|null} [column] TableMetadata column
                         * @property {Array.<google.spanner.executor.v1.IColumnMetadata>|null} [keyColumn] TableMetadata keyColumn
                         */
    
                        /**
                         * Constructs a new TableMetadata.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a TableMetadata.
                         * @implements ITableMetadata
                         * @constructor
                         * @param {google.spanner.executor.v1.ITableMetadata=} [properties] Properties to set
                         */
                        function TableMetadata(properties) {
                            this.column = [];
                            this.keyColumn = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * TableMetadata name.
                         * @member {string} name
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @instance
                         */
                        TableMetadata.prototype.name = "";
    
                        /**
                         * TableMetadata column.
                         * @member {Array.<google.spanner.executor.v1.IColumnMetadata>} column
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @instance
                         */
                        TableMetadata.prototype.column = $util.emptyArray;
    
                        /**
                         * TableMetadata keyColumn.
                         * @member {Array.<google.spanner.executor.v1.IColumnMetadata>} keyColumn
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @instance
                         */
                        TableMetadata.prototype.keyColumn = $util.emptyArray;
    
                        /**
                         * Creates a new TableMetadata instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {google.spanner.executor.v1.ITableMetadata=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.TableMetadata} TableMetadata instance
                         */
                        TableMetadata.create = function create(properties) {
                            return new TableMetadata(properties);
                        };
    
                        /**
                         * Encodes the specified TableMetadata message. Does not implicitly {@link google.spanner.executor.v1.TableMetadata.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {google.spanner.executor.v1.ITableMetadata} message TableMetadata message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        TableMetadata.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                            if (message.column != null && message.column.length)
                                for (var i = 0; i < message.column.length; ++i)
                                    $root.google.spanner.executor.v1.ColumnMetadata.encode(message.column[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.keyColumn != null && message.keyColumn.length)
                                for (var i = 0; i < message.keyColumn.length; ++i)
                                    $root.google.spanner.executor.v1.ColumnMetadata.encode(message.keyColumn[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified TableMetadata message, length delimited. Does not implicitly {@link google.spanner.executor.v1.TableMetadata.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {google.spanner.executor.v1.ITableMetadata} message TableMetadata message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        TableMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a TableMetadata message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.TableMetadata} TableMetadata
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        TableMetadata.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.TableMetadata();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.name = reader.string();
                                        break;
                                    }
                                case 2: {
                                        if (!(message.column && message.column.length))
                                            message.column = [];
                                        message.column.push($root.google.spanner.executor.v1.ColumnMetadata.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        if (!(message.keyColumn && message.keyColumn.length))
                                            message.keyColumn = [];
                                        message.keyColumn.push($root.google.spanner.executor.v1.ColumnMetadata.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a TableMetadata message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.TableMetadata} TableMetadata
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        TableMetadata.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a TableMetadata message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        TableMetadata.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.name != null && message.hasOwnProperty("name"))
                                if (!$util.isString(message.name))
                                    return "name: string expected";
                            if (message.column != null && message.hasOwnProperty("column")) {
                                if (!Array.isArray(message.column))
                                    return "column: array expected";
                                for (var i = 0; i < message.column.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ColumnMetadata.verify(message.column[i]);
                                    if (error)
                                        return "column." + error;
                                }
                            }
                            if (message.keyColumn != null && message.hasOwnProperty("keyColumn")) {
                                if (!Array.isArray(message.keyColumn))
                                    return "keyColumn: array expected";
                                for (var i = 0; i < message.keyColumn.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ColumnMetadata.verify(message.keyColumn[i]);
                                    if (error)
                                        return "keyColumn." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a TableMetadata message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.TableMetadata} TableMetadata
                         */
                        TableMetadata.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.TableMetadata)
                                return object;
                            var message = new $root.google.spanner.executor.v1.TableMetadata();
                            if (object.name != null)
                                message.name = String(object.name);
                            if (object.column) {
                                if (!Array.isArray(object.column))
                                    throw TypeError(".google.spanner.executor.v1.TableMetadata.column: array expected");
                                message.column = [];
                                for (var i = 0; i < object.column.length; ++i) {
                                    if (typeof object.column[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.TableMetadata.column: object expected");
                                    message.column[i] = $root.google.spanner.executor.v1.ColumnMetadata.fromObject(object.column[i]);
                                }
                            }
                            if (object.keyColumn) {
                                if (!Array.isArray(object.keyColumn))
                                    throw TypeError(".google.spanner.executor.v1.TableMetadata.keyColumn: array expected");
                                message.keyColumn = [];
                                for (var i = 0; i < object.keyColumn.length; ++i) {
                                    if (typeof object.keyColumn[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.TableMetadata.keyColumn: object expected");
                                    message.keyColumn[i] = $root.google.spanner.executor.v1.ColumnMetadata.fromObject(object.keyColumn[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a TableMetadata message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {google.spanner.executor.v1.TableMetadata} message TableMetadata
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        TableMetadata.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.column = [];
                                object.keyColumn = [];
                            }
                            if (options.defaults)
                                object.name = "";
                            if (message.name != null && message.hasOwnProperty("name"))
                                object.name = message.name;
                            if (message.column && message.column.length) {
                                object.column = [];
                                for (var j = 0; j < message.column.length; ++j)
                                    object.column[j] = $root.google.spanner.executor.v1.ColumnMetadata.toObject(message.column[j], options);
                            }
                            if (message.keyColumn && message.keyColumn.length) {
                                object.keyColumn = [];
                                for (var j = 0; j < message.keyColumn.length; ++j)
                                    object.keyColumn[j] = $root.google.spanner.executor.v1.ColumnMetadata.toObject(message.keyColumn[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this TableMetadata to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        TableMetadata.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for TableMetadata
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.TableMetadata
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        TableMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.TableMetadata";
                        };
    
                        return TableMetadata;
                    })();
    
                    v1.ColumnMetadata = (function() {
    
                        /**
                         * Properties of a ColumnMetadata.
                         * @memberof google.spanner.executor.v1
                         * @interface IColumnMetadata
                         * @property {string|null} [name] ColumnMetadata name
                         * @property {google.spanner.v1.IType|null} [type] ColumnMetadata type
                         */
    
                        /**
                         * Constructs a new ColumnMetadata.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ColumnMetadata.
                         * @implements IColumnMetadata
                         * @constructor
                         * @param {google.spanner.executor.v1.IColumnMetadata=} [properties] Properties to set
                         */
                        function ColumnMetadata(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ColumnMetadata name.
                         * @member {string} name
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @instance
                         */
                        ColumnMetadata.prototype.name = "";
    
                        /**
                         * ColumnMetadata type.
                         * @member {google.spanner.v1.IType|null|undefined} type
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @instance
                         */
                        ColumnMetadata.prototype.type = null;
    
                        /**
                         * Creates a new ColumnMetadata instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {google.spanner.executor.v1.IColumnMetadata=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ColumnMetadata} ColumnMetadata instance
                         */
                        ColumnMetadata.create = function create(properties) {
                            return new ColumnMetadata(properties);
                        };
    
                        /**
                         * Encodes the specified ColumnMetadata message. Does not implicitly {@link google.spanner.executor.v1.ColumnMetadata.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {google.spanner.executor.v1.IColumnMetadata} message ColumnMetadata message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ColumnMetadata.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                $root.google.spanner.v1.Type.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ColumnMetadata message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ColumnMetadata.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {google.spanner.executor.v1.IColumnMetadata} message ColumnMetadata message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ColumnMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ColumnMetadata message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ColumnMetadata} ColumnMetadata
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ColumnMetadata.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ColumnMetadata();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.name = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.type = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ColumnMetadata message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ColumnMetadata} ColumnMetadata
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ColumnMetadata.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ColumnMetadata message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ColumnMetadata.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.name != null && message.hasOwnProperty("name"))
                                if (!$util.isString(message.name))
                                    return "name: string expected";
                            if (message.type != null && message.hasOwnProperty("type")) {
                                var error = $root.google.spanner.v1.Type.verify(message.type);
                                if (error)
                                    return "type." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ColumnMetadata message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ColumnMetadata} ColumnMetadata
                         */
                        ColumnMetadata.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ColumnMetadata)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ColumnMetadata();
                            if (object.name != null)
                                message.name = String(object.name);
                            if (object.type != null) {
                                if (typeof object.type !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ColumnMetadata.type: object expected");
                                message.type = $root.google.spanner.v1.Type.fromObject(object.type);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ColumnMetadata message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {google.spanner.executor.v1.ColumnMetadata} message ColumnMetadata
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ColumnMetadata.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.name = "";
                                object.type = null;
                            }
                            if (message.name != null && message.hasOwnProperty("name"))
                                object.name = message.name;
                            if (message.type != null && message.hasOwnProperty("type"))
                                object.type = $root.google.spanner.v1.Type.toObject(message.type, options);
                            return object;
                        };
    
                        /**
                         * Converts this ColumnMetadata to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ColumnMetadata.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ColumnMetadata
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ColumnMetadata
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ColumnMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ColumnMetadata";
                        };
    
                        return ColumnMetadata;
                    })();
    
                    v1.TransactionExecutionOptions = (function() {
    
                        /**
                         * Properties of a TransactionExecutionOptions.
                         * @memberof google.spanner.executor.v1
                         * @interface ITransactionExecutionOptions
                         * @property {boolean|null} [optimistic] TransactionExecutionOptions optimistic
                         */
    
                        /**
                         * Constructs a new TransactionExecutionOptions.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a TransactionExecutionOptions.
                         * @implements ITransactionExecutionOptions
                         * @constructor
                         * @param {google.spanner.executor.v1.ITransactionExecutionOptions=} [properties] Properties to set
                         */
                        function TransactionExecutionOptions(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * TransactionExecutionOptions optimistic.
                         * @member {boolean} optimistic
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @instance
                         */
                        TransactionExecutionOptions.prototype.optimistic = false;
    
                        /**
                         * Creates a new TransactionExecutionOptions instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {google.spanner.executor.v1.ITransactionExecutionOptions=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.TransactionExecutionOptions} TransactionExecutionOptions instance
                         */
                        TransactionExecutionOptions.create = function create(properties) {
                            return new TransactionExecutionOptions(properties);
                        };
    
                        /**
                         * Encodes the specified TransactionExecutionOptions message. Does not implicitly {@link google.spanner.executor.v1.TransactionExecutionOptions.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {google.spanner.executor.v1.ITransactionExecutionOptions} message TransactionExecutionOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        TransactionExecutionOptions.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.optimistic != null && Object.hasOwnProperty.call(message, "optimistic"))
                                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.optimistic);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified TransactionExecutionOptions message, length delimited. Does not implicitly {@link google.spanner.executor.v1.TransactionExecutionOptions.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {google.spanner.executor.v1.ITransactionExecutionOptions} message TransactionExecutionOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        TransactionExecutionOptions.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a TransactionExecutionOptions message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.TransactionExecutionOptions} TransactionExecutionOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        TransactionExecutionOptions.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.TransactionExecutionOptions();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.optimistic = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a TransactionExecutionOptions message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.TransactionExecutionOptions} TransactionExecutionOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        TransactionExecutionOptions.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a TransactionExecutionOptions message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        TransactionExecutionOptions.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.optimistic != null && message.hasOwnProperty("optimistic"))
                                if (typeof message.optimistic !== "boolean")
                                    return "optimistic: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a TransactionExecutionOptions message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.TransactionExecutionOptions} TransactionExecutionOptions
                         */
                        TransactionExecutionOptions.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.TransactionExecutionOptions)
                                return object;
                            var message = new $root.google.spanner.executor.v1.TransactionExecutionOptions();
                            if (object.optimistic != null)
                                message.optimistic = Boolean(object.optimistic);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a TransactionExecutionOptions message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {google.spanner.executor.v1.TransactionExecutionOptions} message TransactionExecutionOptions
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        TransactionExecutionOptions.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.optimistic = false;
                            if (message.optimistic != null && message.hasOwnProperty("optimistic"))
                                object.optimistic = message.optimistic;
                            return object;
                        };
    
                        /**
                         * Converts this TransactionExecutionOptions to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        TransactionExecutionOptions.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for TransactionExecutionOptions
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.TransactionExecutionOptions
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        TransactionExecutionOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.TransactionExecutionOptions";
                        };
    
                        return TransactionExecutionOptions;
                    })();
    
                    v1.FinishTransactionAction = (function() {
    
                        /**
                         * Properties of a FinishTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IFinishTransactionAction
                         * @property {google.spanner.executor.v1.FinishTransactionAction.Mode|null} [mode] FinishTransactionAction mode
                         */
    
                        /**
                         * Constructs a new FinishTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a FinishTransactionAction.
                         * @implements IFinishTransactionAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IFinishTransactionAction=} [properties] Properties to set
                         */
                        function FinishTransactionAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * FinishTransactionAction mode.
                         * @member {google.spanner.executor.v1.FinishTransactionAction.Mode} mode
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @instance
                         */
                        FinishTransactionAction.prototype.mode = 0;
    
                        /**
                         * Creates a new FinishTransactionAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IFinishTransactionAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.FinishTransactionAction} FinishTransactionAction instance
                         */
                        FinishTransactionAction.create = function create(properties) {
                            return new FinishTransactionAction(properties);
                        };
    
                        /**
                         * Encodes the specified FinishTransactionAction message. Does not implicitly {@link google.spanner.executor.v1.FinishTransactionAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IFinishTransactionAction} message FinishTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        FinishTransactionAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.mode != null && Object.hasOwnProperty.call(message, "mode"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.mode);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified FinishTransactionAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.FinishTransactionAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IFinishTransactionAction} message FinishTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        FinishTransactionAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a FinishTransactionAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.FinishTransactionAction} FinishTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        FinishTransactionAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.FinishTransactionAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.mode = reader.int32();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a FinishTransactionAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.FinishTransactionAction} FinishTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        FinishTransactionAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a FinishTransactionAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        FinishTransactionAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.mode != null && message.hasOwnProperty("mode"))
                                switch (message.mode) {
                                default:
                                    return "mode: enum value expected";
                                case 0:
                                case 1:
                                case 2:
                                    break;
                                }
                            return null;
                        };
    
                        /**
                         * Creates a FinishTransactionAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.FinishTransactionAction} FinishTransactionAction
                         */
                        FinishTransactionAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.FinishTransactionAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.FinishTransactionAction();
                            switch (object.mode) {
                            default:
                                if (typeof object.mode === "number") {
                                    message.mode = object.mode;
                                    break;
                                }
                                break;
                            case "MODE_UNSPECIFIED":
                            case 0:
                                message.mode = 0;
                                break;
                            case "COMMIT":
                            case 1:
                                message.mode = 1;
                                break;
                            case "ABANDON":
                            case 2:
                                message.mode = 2;
                                break;
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a FinishTransactionAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.FinishTransactionAction} message FinishTransactionAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        FinishTransactionAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.mode = options.enums === String ? "MODE_UNSPECIFIED" : 0;
                            if (message.mode != null && message.hasOwnProperty("mode"))
                                object.mode = options.enums === String ? $root.google.spanner.executor.v1.FinishTransactionAction.Mode[message.mode] === undefined ? message.mode : $root.google.spanner.executor.v1.FinishTransactionAction.Mode[message.mode] : message.mode;
                            return object;
                        };
    
                        /**
                         * Converts this FinishTransactionAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        FinishTransactionAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for FinishTransactionAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.FinishTransactionAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        FinishTransactionAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.FinishTransactionAction";
                        };
    
                        /**
                         * Mode enum.
                         * @name google.spanner.executor.v1.FinishTransactionAction.Mode
                         * @enum {number}
                         * @property {number} MODE_UNSPECIFIED=0 MODE_UNSPECIFIED value
                         * @property {number} COMMIT=1 COMMIT value
                         * @property {number} ABANDON=2 ABANDON value
                         */
                        FinishTransactionAction.Mode = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "MODE_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "COMMIT"] = 1;
                            values[valuesById[2] = "ABANDON"] = 2;
                            return values;
                        })();
    
                        return FinishTransactionAction;
                    })();
    
                    v1.AdminAction = (function() {
    
                        /**
                         * Properties of an AdminAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IAdminAction
                         * @property {google.spanner.executor.v1.ICreateUserInstanceConfigAction|null} [createUserInstanceConfig] AdminAction createUserInstanceConfig
                         * @property {google.spanner.executor.v1.IUpdateUserInstanceConfigAction|null} [updateUserInstanceConfig] AdminAction updateUserInstanceConfig
                         * @property {google.spanner.executor.v1.IDeleteUserInstanceConfigAction|null} [deleteUserInstanceConfig] AdminAction deleteUserInstanceConfig
                         * @property {google.spanner.executor.v1.IGetCloudInstanceConfigAction|null} [getCloudInstanceConfig] AdminAction getCloudInstanceConfig
                         * @property {google.spanner.executor.v1.IListCloudInstanceConfigsAction|null} [listInstanceConfigs] AdminAction listInstanceConfigs
                         * @property {google.spanner.executor.v1.ICreateCloudInstanceAction|null} [createCloudInstance] AdminAction createCloudInstance
                         * @property {google.spanner.executor.v1.IUpdateCloudInstanceAction|null} [updateCloudInstance] AdminAction updateCloudInstance
                         * @property {google.spanner.executor.v1.IDeleteCloudInstanceAction|null} [deleteCloudInstance] AdminAction deleteCloudInstance
                         * @property {google.spanner.executor.v1.IListCloudInstancesAction|null} [listCloudInstances] AdminAction listCloudInstances
                         * @property {google.spanner.executor.v1.IGetCloudInstanceAction|null} [getCloudInstance] AdminAction getCloudInstance
                         * @property {google.spanner.executor.v1.ICreateCloudDatabaseAction|null} [createCloudDatabase] AdminAction createCloudDatabase
                         * @property {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction|null} [updateCloudDatabaseDdl] AdminAction updateCloudDatabaseDdl
                         * @property {google.spanner.executor.v1.IUpdateCloudDatabaseAction|null} [updateCloudDatabase] AdminAction updateCloudDatabase
                         * @property {google.spanner.executor.v1.IDropCloudDatabaseAction|null} [dropCloudDatabase] AdminAction dropCloudDatabase
                         * @property {google.spanner.executor.v1.IListCloudDatabasesAction|null} [listCloudDatabases] AdminAction listCloudDatabases
                         * @property {google.spanner.executor.v1.IListCloudDatabaseOperationsAction|null} [listCloudDatabaseOperations] AdminAction listCloudDatabaseOperations
                         * @property {google.spanner.executor.v1.IRestoreCloudDatabaseAction|null} [restoreCloudDatabase] AdminAction restoreCloudDatabase
                         * @property {google.spanner.executor.v1.IGetCloudDatabaseAction|null} [getCloudDatabase] AdminAction getCloudDatabase
                         * @property {google.spanner.executor.v1.ICreateCloudBackupAction|null} [createCloudBackup] AdminAction createCloudBackup
                         * @property {google.spanner.executor.v1.ICopyCloudBackupAction|null} [copyCloudBackup] AdminAction copyCloudBackup
                         * @property {google.spanner.executor.v1.IGetCloudBackupAction|null} [getCloudBackup] AdminAction getCloudBackup
                         * @property {google.spanner.executor.v1.IUpdateCloudBackupAction|null} [updateCloudBackup] AdminAction updateCloudBackup
                         * @property {google.spanner.executor.v1.IDeleteCloudBackupAction|null} [deleteCloudBackup] AdminAction deleteCloudBackup
                         * @property {google.spanner.executor.v1.IListCloudBackupsAction|null} [listCloudBackups] AdminAction listCloudBackups
                         * @property {google.spanner.executor.v1.IListCloudBackupOperationsAction|null} [listCloudBackupOperations] AdminAction listCloudBackupOperations
                         * @property {google.spanner.executor.v1.IGetOperationAction|null} [getOperation] AdminAction getOperation
                         * @property {google.spanner.executor.v1.ICancelOperationAction|null} [cancelOperation] AdminAction cancelOperation
                         * @property {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction|null} [changeQuorumCloudDatabase] AdminAction changeQuorumCloudDatabase
                         */
    
                        /**
                         * Constructs a new AdminAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an AdminAction.
                         * @implements IAdminAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IAdminAction=} [properties] Properties to set
                         */
                        function AdminAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * AdminAction createUserInstanceConfig.
                         * @member {google.spanner.executor.v1.ICreateUserInstanceConfigAction|null|undefined} createUserInstanceConfig
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.createUserInstanceConfig = null;
    
                        /**
                         * AdminAction updateUserInstanceConfig.
                         * @member {google.spanner.executor.v1.IUpdateUserInstanceConfigAction|null|undefined} updateUserInstanceConfig
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.updateUserInstanceConfig = null;
    
                        /**
                         * AdminAction deleteUserInstanceConfig.
                         * @member {google.spanner.executor.v1.IDeleteUserInstanceConfigAction|null|undefined} deleteUserInstanceConfig
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.deleteUserInstanceConfig = null;
    
                        /**
                         * AdminAction getCloudInstanceConfig.
                         * @member {google.spanner.executor.v1.IGetCloudInstanceConfigAction|null|undefined} getCloudInstanceConfig
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.getCloudInstanceConfig = null;
    
                        /**
                         * AdminAction listInstanceConfigs.
                         * @member {google.spanner.executor.v1.IListCloudInstanceConfigsAction|null|undefined} listInstanceConfigs
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listInstanceConfigs = null;
    
                        /**
                         * AdminAction createCloudInstance.
                         * @member {google.spanner.executor.v1.ICreateCloudInstanceAction|null|undefined} createCloudInstance
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.createCloudInstance = null;
    
                        /**
                         * AdminAction updateCloudInstance.
                         * @member {google.spanner.executor.v1.IUpdateCloudInstanceAction|null|undefined} updateCloudInstance
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.updateCloudInstance = null;
    
                        /**
                         * AdminAction deleteCloudInstance.
                         * @member {google.spanner.executor.v1.IDeleteCloudInstanceAction|null|undefined} deleteCloudInstance
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.deleteCloudInstance = null;
    
                        /**
                         * AdminAction listCloudInstances.
                         * @member {google.spanner.executor.v1.IListCloudInstancesAction|null|undefined} listCloudInstances
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listCloudInstances = null;
    
                        /**
                         * AdminAction getCloudInstance.
                         * @member {google.spanner.executor.v1.IGetCloudInstanceAction|null|undefined} getCloudInstance
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.getCloudInstance = null;
    
                        /**
                         * AdminAction createCloudDatabase.
                         * @member {google.spanner.executor.v1.ICreateCloudDatabaseAction|null|undefined} createCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.createCloudDatabase = null;
    
                        /**
                         * AdminAction updateCloudDatabaseDdl.
                         * @member {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction|null|undefined} updateCloudDatabaseDdl
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.updateCloudDatabaseDdl = null;
    
                        /**
                         * AdminAction updateCloudDatabase.
                         * @member {google.spanner.executor.v1.IUpdateCloudDatabaseAction|null|undefined} updateCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.updateCloudDatabase = null;
    
                        /**
                         * AdminAction dropCloudDatabase.
                         * @member {google.spanner.executor.v1.IDropCloudDatabaseAction|null|undefined} dropCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.dropCloudDatabase = null;
    
                        /**
                         * AdminAction listCloudDatabases.
                         * @member {google.spanner.executor.v1.IListCloudDatabasesAction|null|undefined} listCloudDatabases
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listCloudDatabases = null;
    
                        /**
                         * AdminAction listCloudDatabaseOperations.
                         * @member {google.spanner.executor.v1.IListCloudDatabaseOperationsAction|null|undefined} listCloudDatabaseOperations
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listCloudDatabaseOperations = null;
    
                        /**
                         * AdminAction restoreCloudDatabase.
                         * @member {google.spanner.executor.v1.IRestoreCloudDatabaseAction|null|undefined} restoreCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.restoreCloudDatabase = null;
    
                        /**
                         * AdminAction getCloudDatabase.
                         * @member {google.spanner.executor.v1.IGetCloudDatabaseAction|null|undefined} getCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.getCloudDatabase = null;
    
                        /**
                         * AdminAction createCloudBackup.
                         * @member {google.spanner.executor.v1.ICreateCloudBackupAction|null|undefined} createCloudBackup
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.createCloudBackup = null;
    
                        /**
                         * AdminAction copyCloudBackup.
                         * @member {google.spanner.executor.v1.ICopyCloudBackupAction|null|undefined} copyCloudBackup
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.copyCloudBackup = null;
    
                        /**
                         * AdminAction getCloudBackup.
                         * @member {google.spanner.executor.v1.IGetCloudBackupAction|null|undefined} getCloudBackup
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.getCloudBackup = null;
    
                        /**
                         * AdminAction updateCloudBackup.
                         * @member {google.spanner.executor.v1.IUpdateCloudBackupAction|null|undefined} updateCloudBackup
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.updateCloudBackup = null;
    
                        /**
                         * AdminAction deleteCloudBackup.
                         * @member {google.spanner.executor.v1.IDeleteCloudBackupAction|null|undefined} deleteCloudBackup
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.deleteCloudBackup = null;
    
                        /**
                         * AdminAction listCloudBackups.
                         * @member {google.spanner.executor.v1.IListCloudBackupsAction|null|undefined} listCloudBackups
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listCloudBackups = null;
    
                        /**
                         * AdminAction listCloudBackupOperations.
                         * @member {google.spanner.executor.v1.IListCloudBackupOperationsAction|null|undefined} listCloudBackupOperations
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.listCloudBackupOperations = null;
    
                        /**
                         * AdminAction getOperation.
                         * @member {google.spanner.executor.v1.IGetOperationAction|null|undefined} getOperation
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.getOperation = null;
    
                        /**
                         * AdminAction cancelOperation.
                         * @member {google.spanner.executor.v1.ICancelOperationAction|null|undefined} cancelOperation
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.cancelOperation = null;
    
                        /**
                         * AdminAction changeQuorumCloudDatabase.
                         * @member {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction|null|undefined} changeQuorumCloudDatabase
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        AdminAction.prototype.changeQuorumCloudDatabase = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * AdminAction action.
                         * @member {"createUserInstanceConfig"|"updateUserInstanceConfig"|"deleteUserInstanceConfig"|"getCloudInstanceConfig"|"listInstanceConfigs"|"createCloudInstance"|"updateCloudInstance"|"deleteCloudInstance"|"listCloudInstances"|"getCloudInstance"|"createCloudDatabase"|"updateCloudDatabaseDdl"|"updateCloudDatabase"|"dropCloudDatabase"|"listCloudDatabases"|"listCloudDatabaseOperations"|"restoreCloudDatabase"|"getCloudDatabase"|"createCloudBackup"|"copyCloudBackup"|"getCloudBackup"|"updateCloudBackup"|"deleteCloudBackup"|"listCloudBackups"|"listCloudBackupOperations"|"getOperation"|"cancelOperation"|"changeQuorumCloudDatabase"|undefined} action
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         */
                        Object.defineProperty(AdminAction.prototype, "action", {
                            get: $util.oneOfGetter($oneOfFields = ["createUserInstanceConfig", "updateUserInstanceConfig", "deleteUserInstanceConfig", "getCloudInstanceConfig", "listInstanceConfigs", "createCloudInstance", "updateCloudInstance", "deleteCloudInstance", "listCloudInstances", "getCloudInstance", "createCloudDatabase", "updateCloudDatabaseDdl", "updateCloudDatabase", "dropCloudDatabase", "listCloudDatabases", "listCloudDatabaseOperations", "restoreCloudDatabase", "getCloudDatabase", "createCloudBackup", "copyCloudBackup", "getCloudBackup", "updateCloudBackup", "deleteCloudBackup", "listCloudBackups", "listCloudBackupOperations", "getOperation", "cancelOperation", "changeQuorumCloudDatabase"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new AdminAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {google.spanner.executor.v1.IAdminAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.AdminAction} AdminAction instance
                         */
                        AdminAction.create = function create(properties) {
                            return new AdminAction(properties);
                        };
    
                        /**
                         * Encodes the specified AdminAction message. Does not implicitly {@link google.spanner.executor.v1.AdminAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {google.spanner.executor.v1.IAdminAction} message AdminAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        AdminAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.createUserInstanceConfig != null && Object.hasOwnProperty.call(message, "createUserInstanceConfig"))
                                $root.google.spanner.executor.v1.CreateUserInstanceConfigAction.encode(message.createUserInstanceConfig, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.updateUserInstanceConfig != null && Object.hasOwnProperty.call(message, "updateUserInstanceConfig"))
                                $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction.encode(message.updateUserInstanceConfig, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.deleteUserInstanceConfig != null && Object.hasOwnProperty.call(message, "deleteUserInstanceConfig"))
                                $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction.encode(message.deleteUserInstanceConfig, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            if (message.getCloudInstanceConfig != null && Object.hasOwnProperty.call(message, "getCloudInstanceConfig"))
                                $root.google.spanner.executor.v1.GetCloudInstanceConfigAction.encode(message.getCloudInstanceConfig, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.listInstanceConfigs != null && Object.hasOwnProperty.call(message, "listInstanceConfigs"))
                                $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction.encode(message.listInstanceConfigs, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            if (message.createCloudInstance != null && Object.hasOwnProperty.call(message, "createCloudInstance"))
                                $root.google.spanner.executor.v1.CreateCloudInstanceAction.encode(message.createCloudInstance, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                            if (message.updateCloudInstance != null && Object.hasOwnProperty.call(message, "updateCloudInstance"))
                                $root.google.spanner.executor.v1.UpdateCloudInstanceAction.encode(message.updateCloudInstance, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            if (message.deleteCloudInstance != null && Object.hasOwnProperty.call(message, "deleteCloudInstance"))
                                $root.google.spanner.executor.v1.DeleteCloudInstanceAction.encode(message.deleteCloudInstance, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                            if (message.listCloudInstances != null && Object.hasOwnProperty.call(message, "listCloudInstances"))
                                $root.google.spanner.executor.v1.ListCloudInstancesAction.encode(message.listCloudInstances, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                            if (message.getCloudInstance != null && Object.hasOwnProperty.call(message, "getCloudInstance"))
                                $root.google.spanner.executor.v1.GetCloudInstanceAction.encode(message.getCloudInstance, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                            if (message.createCloudDatabase != null && Object.hasOwnProperty.call(message, "createCloudDatabase"))
                                $root.google.spanner.executor.v1.CreateCloudDatabaseAction.encode(message.createCloudDatabase, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                            if (message.updateCloudDatabaseDdl != null && Object.hasOwnProperty.call(message, "updateCloudDatabaseDdl"))
                                $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.encode(message.updateCloudDatabaseDdl, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                            if (message.dropCloudDatabase != null && Object.hasOwnProperty.call(message, "dropCloudDatabase"))
                                $root.google.spanner.executor.v1.DropCloudDatabaseAction.encode(message.dropCloudDatabase, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
                            if (message.listCloudDatabases != null && Object.hasOwnProperty.call(message, "listCloudDatabases"))
                                $root.google.spanner.executor.v1.ListCloudDatabasesAction.encode(message.listCloudDatabases, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
                            if (message.listCloudDatabaseOperations != null && Object.hasOwnProperty.call(message, "listCloudDatabaseOperations"))
                                $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction.encode(message.listCloudDatabaseOperations, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();
                            if (message.restoreCloudDatabase != null && Object.hasOwnProperty.call(message, "restoreCloudDatabase"))
                                $root.google.spanner.executor.v1.RestoreCloudDatabaseAction.encode(message.restoreCloudDatabase, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim();
                            if (message.getCloudDatabase != null && Object.hasOwnProperty.call(message, "getCloudDatabase"))
                                $root.google.spanner.executor.v1.GetCloudDatabaseAction.encode(message.getCloudDatabase, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim();
                            if (message.createCloudBackup != null && Object.hasOwnProperty.call(message, "createCloudBackup"))
                                $root.google.spanner.executor.v1.CreateCloudBackupAction.encode(message.createCloudBackup, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim();
                            if (message.copyCloudBackup != null && Object.hasOwnProperty.call(message, "copyCloudBackup"))
                                $root.google.spanner.executor.v1.CopyCloudBackupAction.encode(message.copyCloudBackup, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim();
                            if (message.getCloudBackup != null && Object.hasOwnProperty.call(message, "getCloudBackup"))
                                $root.google.spanner.executor.v1.GetCloudBackupAction.encode(message.getCloudBackup, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim();
                            if (message.updateCloudBackup != null && Object.hasOwnProperty.call(message, "updateCloudBackup"))
                                $root.google.spanner.executor.v1.UpdateCloudBackupAction.encode(message.updateCloudBackup, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim();
                            if (message.deleteCloudBackup != null && Object.hasOwnProperty.call(message, "deleteCloudBackup"))
                                $root.google.spanner.executor.v1.DeleteCloudBackupAction.encode(message.deleteCloudBackup, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();
                            if (message.listCloudBackups != null && Object.hasOwnProperty.call(message, "listCloudBackups"))
                                $root.google.spanner.executor.v1.ListCloudBackupsAction.encode(message.listCloudBackups, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();
                            if (message.listCloudBackupOperations != null && Object.hasOwnProperty.call(message, "listCloudBackupOperations"))
                                $root.google.spanner.executor.v1.ListCloudBackupOperationsAction.encode(message.listCloudBackupOperations, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim();
                            if (message.getOperation != null && Object.hasOwnProperty.call(message, "getOperation"))
                                $root.google.spanner.executor.v1.GetOperationAction.encode(message.getOperation, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim();
                            if (message.cancelOperation != null && Object.hasOwnProperty.call(message, "cancelOperation"))
                                $root.google.spanner.executor.v1.CancelOperationAction.encode(message.cancelOperation, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim();
                            if (message.updateCloudDatabase != null && Object.hasOwnProperty.call(message, "updateCloudDatabase"))
                                $root.google.spanner.executor.v1.UpdateCloudDatabaseAction.encode(message.updateCloudDatabase, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim();
                            if (message.changeQuorumCloudDatabase != null && Object.hasOwnProperty.call(message, "changeQuorumCloudDatabase"))
                                $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.encode(message.changeQuorumCloudDatabase, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified AdminAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.AdminAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {google.spanner.executor.v1.IAdminAction} message AdminAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        AdminAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an AdminAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.AdminAction} AdminAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        AdminAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.AdminAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.createUserInstanceConfig = $root.google.spanner.executor.v1.CreateUserInstanceConfigAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.updateUserInstanceConfig = $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.deleteUserInstanceConfig = $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 4: {
                                        message.getCloudInstanceConfig = $root.google.spanner.executor.v1.GetCloudInstanceConfigAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        message.listInstanceConfigs = $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 6: {
                                        message.createCloudInstance = $root.google.spanner.executor.v1.CreateCloudInstanceAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 7: {
                                        message.updateCloudInstance = $root.google.spanner.executor.v1.UpdateCloudInstanceAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 8: {
                                        message.deleteCloudInstance = $root.google.spanner.executor.v1.DeleteCloudInstanceAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 9: {
                                        message.listCloudInstances = $root.google.spanner.executor.v1.ListCloudInstancesAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 10: {
                                        message.getCloudInstance = $root.google.spanner.executor.v1.GetCloudInstanceAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 11: {
                                        message.createCloudDatabase = $root.google.spanner.executor.v1.CreateCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 12: {
                                        message.updateCloudDatabaseDdl = $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 27: {
                                        message.updateCloudDatabase = $root.google.spanner.executor.v1.UpdateCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 13: {
                                        message.dropCloudDatabase = $root.google.spanner.executor.v1.DropCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 14: {
                                        message.listCloudDatabases = $root.google.spanner.executor.v1.ListCloudDatabasesAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 15: {
                                        message.listCloudDatabaseOperations = $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 16: {
                                        message.restoreCloudDatabase = $root.google.spanner.executor.v1.RestoreCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 17: {
                                        message.getCloudDatabase = $root.google.spanner.executor.v1.GetCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 18: {
                                        message.createCloudBackup = $root.google.spanner.executor.v1.CreateCloudBackupAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 19: {
                                        message.copyCloudBackup = $root.google.spanner.executor.v1.CopyCloudBackupAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 20: {
                                        message.getCloudBackup = $root.google.spanner.executor.v1.GetCloudBackupAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 21: {
                                        message.updateCloudBackup = $root.google.spanner.executor.v1.UpdateCloudBackupAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 22: {
                                        message.deleteCloudBackup = $root.google.spanner.executor.v1.DeleteCloudBackupAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 23: {
                                        message.listCloudBackups = $root.google.spanner.executor.v1.ListCloudBackupsAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 24: {
                                        message.listCloudBackupOperations = $root.google.spanner.executor.v1.ListCloudBackupOperationsAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 25: {
                                        message.getOperation = $root.google.spanner.executor.v1.GetOperationAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 26: {
                                        message.cancelOperation = $root.google.spanner.executor.v1.CancelOperationAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 28: {
                                        message.changeQuorumCloudDatabase = $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an AdminAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.AdminAction} AdminAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        AdminAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an AdminAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        AdminAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.createUserInstanceConfig != null && message.hasOwnProperty("createUserInstanceConfig")) {
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CreateUserInstanceConfigAction.verify(message.createUserInstanceConfig);
                                    if (error)
                                        return "createUserInstanceConfig." + error;
                                }
                            }
                            if (message.updateUserInstanceConfig != null && message.hasOwnProperty("updateUserInstanceConfig")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction.verify(message.updateUserInstanceConfig);
                                    if (error)
                                        return "updateUserInstanceConfig." + error;
                                }
                            }
                            if (message.deleteUserInstanceConfig != null && message.hasOwnProperty("deleteUserInstanceConfig")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction.verify(message.deleteUserInstanceConfig);
                                    if (error)
                                        return "deleteUserInstanceConfig." + error;
                                }
                            }
                            if (message.getCloudInstanceConfig != null && message.hasOwnProperty("getCloudInstanceConfig")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GetCloudInstanceConfigAction.verify(message.getCloudInstanceConfig);
                                    if (error)
                                        return "getCloudInstanceConfig." + error;
                                }
                            }
                            if (message.listInstanceConfigs != null && message.hasOwnProperty("listInstanceConfigs")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction.verify(message.listInstanceConfigs);
                                    if (error)
                                        return "listInstanceConfigs." + error;
                                }
                            }
                            if (message.createCloudInstance != null && message.hasOwnProperty("createCloudInstance")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CreateCloudInstanceAction.verify(message.createCloudInstance);
                                    if (error)
                                        return "createCloudInstance." + error;
                                }
                            }
                            if (message.updateCloudInstance != null && message.hasOwnProperty("updateCloudInstance")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.UpdateCloudInstanceAction.verify(message.updateCloudInstance);
                                    if (error)
                                        return "updateCloudInstance." + error;
                                }
                            }
                            if (message.deleteCloudInstance != null && message.hasOwnProperty("deleteCloudInstance")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DeleteCloudInstanceAction.verify(message.deleteCloudInstance);
                                    if (error)
                                        return "deleteCloudInstance." + error;
                                }
                            }
                            if (message.listCloudInstances != null && message.hasOwnProperty("listCloudInstances")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudInstancesAction.verify(message.listCloudInstances);
                                    if (error)
                                        return "listCloudInstances." + error;
                                }
                            }
                            if (message.getCloudInstance != null && message.hasOwnProperty("getCloudInstance")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GetCloudInstanceAction.verify(message.getCloudInstance);
                                    if (error)
                                        return "getCloudInstance." + error;
                                }
                            }
                            if (message.createCloudDatabase != null && message.hasOwnProperty("createCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CreateCloudDatabaseAction.verify(message.createCloudDatabase);
                                    if (error)
                                        return "createCloudDatabase." + error;
                                }
                            }
                            if (message.updateCloudDatabaseDdl != null && message.hasOwnProperty("updateCloudDatabaseDdl")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.verify(message.updateCloudDatabaseDdl);
                                    if (error)
                                        return "updateCloudDatabaseDdl." + error;
                                }
                            }
                            if (message.updateCloudDatabase != null && message.hasOwnProperty("updateCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.UpdateCloudDatabaseAction.verify(message.updateCloudDatabase);
                                    if (error)
                                        return "updateCloudDatabase." + error;
                                }
                            }
                            if (message.dropCloudDatabase != null && message.hasOwnProperty("dropCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DropCloudDatabaseAction.verify(message.dropCloudDatabase);
                                    if (error)
                                        return "dropCloudDatabase." + error;
                                }
                            }
                            if (message.listCloudDatabases != null && message.hasOwnProperty("listCloudDatabases")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudDatabasesAction.verify(message.listCloudDatabases);
                                    if (error)
                                        return "listCloudDatabases." + error;
                                }
                            }
                            if (message.listCloudDatabaseOperations != null && message.hasOwnProperty("listCloudDatabaseOperations")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction.verify(message.listCloudDatabaseOperations);
                                    if (error)
                                        return "listCloudDatabaseOperations." + error;
                                }
                            }
                            if (message.restoreCloudDatabase != null && message.hasOwnProperty("restoreCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.RestoreCloudDatabaseAction.verify(message.restoreCloudDatabase);
                                    if (error)
                                        return "restoreCloudDatabase." + error;
                                }
                            }
                            if (message.getCloudDatabase != null && message.hasOwnProperty("getCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GetCloudDatabaseAction.verify(message.getCloudDatabase);
                                    if (error)
                                        return "getCloudDatabase." + error;
                                }
                            }
                            if (message.createCloudBackup != null && message.hasOwnProperty("createCloudBackup")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CreateCloudBackupAction.verify(message.createCloudBackup);
                                    if (error)
                                        return "createCloudBackup." + error;
                                }
                            }
                            if (message.copyCloudBackup != null && message.hasOwnProperty("copyCloudBackup")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CopyCloudBackupAction.verify(message.copyCloudBackup);
                                    if (error)
                                        return "copyCloudBackup." + error;
                                }
                            }
                            if (message.getCloudBackup != null && message.hasOwnProperty("getCloudBackup")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GetCloudBackupAction.verify(message.getCloudBackup);
                                    if (error)
                                        return "getCloudBackup." + error;
                                }
                            }
                            if (message.updateCloudBackup != null && message.hasOwnProperty("updateCloudBackup")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.UpdateCloudBackupAction.verify(message.updateCloudBackup);
                                    if (error)
                                        return "updateCloudBackup." + error;
                                }
                            }
                            if (message.deleteCloudBackup != null && message.hasOwnProperty("deleteCloudBackup")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DeleteCloudBackupAction.verify(message.deleteCloudBackup);
                                    if (error)
                                        return "deleteCloudBackup." + error;
                                }
                            }
                            if (message.listCloudBackups != null && message.hasOwnProperty("listCloudBackups")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudBackupsAction.verify(message.listCloudBackups);
                                    if (error)
                                        return "listCloudBackups." + error;
                                }
                            }
                            if (message.listCloudBackupOperations != null && message.hasOwnProperty("listCloudBackupOperations")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ListCloudBackupOperationsAction.verify(message.listCloudBackupOperations);
                                    if (error)
                                        return "listCloudBackupOperations." + error;
                                }
                            }
                            if (message.getOperation != null && message.hasOwnProperty("getOperation")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.GetOperationAction.verify(message.getOperation);
                                    if (error)
                                        return "getOperation." + error;
                                }
                            }
                            if (message.cancelOperation != null && message.hasOwnProperty("cancelOperation")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.CancelOperationAction.verify(message.cancelOperation);
                                    if (error)
                                        return "cancelOperation." + error;
                                }
                            }
                            if (message.changeQuorumCloudDatabase != null && message.hasOwnProperty("changeQuorumCloudDatabase")) {
                                if (properties.action === 1)
                                    return "action: multiple values";
                                properties.action = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.verify(message.changeQuorumCloudDatabase);
                                    if (error)
                                        return "changeQuorumCloudDatabase." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates an AdminAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.AdminAction} AdminAction
                         */
                        AdminAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.AdminAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.AdminAction();
                            if (object.createUserInstanceConfig != null) {
                                if (typeof object.createUserInstanceConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.createUserInstanceConfig: object expected");
                                message.createUserInstanceConfig = $root.google.spanner.executor.v1.CreateUserInstanceConfigAction.fromObject(object.createUserInstanceConfig);
                            }
                            if (object.updateUserInstanceConfig != null) {
                                if (typeof object.updateUserInstanceConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.updateUserInstanceConfig: object expected");
                                message.updateUserInstanceConfig = $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction.fromObject(object.updateUserInstanceConfig);
                            }
                            if (object.deleteUserInstanceConfig != null) {
                                if (typeof object.deleteUserInstanceConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.deleteUserInstanceConfig: object expected");
                                message.deleteUserInstanceConfig = $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction.fromObject(object.deleteUserInstanceConfig);
                            }
                            if (object.getCloudInstanceConfig != null) {
                                if (typeof object.getCloudInstanceConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.getCloudInstanceConfig: object expected");
                                message.getCloudInstanceConfig = $root.google.spanner.executor.v1.GetCloudInstanceConfigAction.fromObject(object.getCloudInstanceConfig);
                            }
                            if (object.listInstanceConfigs != null) {
                                if (typeof object.listInstanceConfigs !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listInstanceConfigs: object expected");
                                message.listInstanceConfigs = $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction.fromObject(object.listInstanceConfigs);
                            }
                            if (object.createCloudInstance != null) {
                                if (typeof object.createCloudInstance !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.createCloudInstance: object expected");
                                message.createCloudInstance = $root.google.spanner.executor.v1.CreateCloudInstanceAction.fromObject(object.createCloudInstance);
                            }
                            if (object.updateCloudInstance != null) {
                                if (typeof object.updateCloudInstance !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.updateCloudInstance: object expected");
                                message.updateCloudInstance = $root.google.spanner.executor.v1.UpdateCloudInstanceAction.fromObject(object.updateCloudInstance);
                            }
                            if (object.deleteCloudInstance != null) {
                                if (typeof object.deleteCloudInstance !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.deleteCloudInstance: object expected");
                                message.deleteCloudInstance = $root.google.spanner.executor.v1.DeleteCloudInstanceAction.fromObject(object.deleteCloudInstance);
                            }
                            if (object.listCloudInstances != null) {
                                if (typeof object.listCloudInstances !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listCloudInstances: object expected");
                                message.listCloudInstances = $root.google.spanner.executor.v1.ListCloudInstancesAction.fromObject(object.listCloudInstances);
                            }
                            if (object.getCloudInstance != null) {
                                if (typeof object.getCloudInstance !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.getCloudInstance: object expected");
                                message.getCloudInstance = $root.google.spanner.executor.v1.GetCloudInstanceAction.fromObject(object.getCloudInstance);
                            }
                            if (object.createCloudDatabase != null) {
                                if (typeof object.createCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.createCloudDatabase: object expected");
                                message.createCloudDatabase = $root.google.spanner.executor.v1.CreateCloudDatabaseAction.fromObject(object.createCloudDatabase);
                            }
                            if (object.updateCloudDatabaseDdl != null) {
                                if (typeof object.updateCloudDatabaseDdl !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.updateCloudDatabaseDdl: object expected");
                                message.updateCloudDatabaseDdl = $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.fromObject(object.updateCloudDatabaseDdl);
                            }
                            if (object.updateCloudDatabase != null) {
                                if (typeof object.updateCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.updateCloudDatabase: object expected");
                                message.updateCloudDatabase = $root.google.spanner.executor.v1.UpdateCloudDatabaseAction.fromObject(object.updateCloudDatabase);
                            }
                            if (object.dropCloudDatabase != null) {
                                if (typeof object.dropCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.dropCloudDatabase: object expected");
                                message.dropCloudDatabase = $root.google.spanner.executor.v1.DropCloudDatabaseAction.fromObject(object.dropCloudDatabase);
                            }
                            if (object.listCloudDatabases != null) {
                                if (typeof object.listCloudDatabases !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listCloudDatabases: object expected");
                                message.listCloudDatabases = $root.google.spanner.executor.v1.ListCloudDatabasesAction.fromObject(object.listCloudDatabases);
                            }
                            if (object.listCloudDatabaseOperations != null) {
                                if (typeof object.listCloudDatabaseOperations !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listCloudDatabaseOperations: object expected");
                                message.listCloudDatabaseOperations = $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction.fromObject(object.listCloudDatabaseOperations);
                            }
                            if (object.restoreCloudDatabase != null) {
                                if (typeof object.restoreCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.restoreCloudDatabase: object expected");
                                message.restoreCloudDatabase = $root.google.spanner.executor.v1.RestoreCloudDatabaseAction.fromObject(object.restoreCloudDatabase);
                            }
                            if (object.getCloudDatabase != null) {
                                if (typeof object.getCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.getCloudDatabase: object expected");
                                message.getCloudDatabase = $root.google.spanner.executor.v1.GetCloudDatabaseAction.fromObject(object.getCloudDatabase);
                            }
                            if (object.createCloudBackup != null) {
                                if (typeof object.createCloudBackup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.createCloudBackup: object expected");
                                message.createCloudBackup = $root.google.spanner.executor.v1.CreateCloudBackupAction.fromObject(object.createCloudBackup);
                            }
                            if (object.copyCloudBackup != null) {
                                if (typeof object.copyCloudBackup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.copyCloudBackup: object expected");
                                message.copyCloudBackup = $root.google.spanner.executor.v1.CopyCloudBackupAction.fromObject(object.copyCloudBackup);
                            }
                            if (object.getCloudBackup != null) {
                                if (typeof object.getCloudBackup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.getCloudBackup: object expected");
                                message.getCloudBackup = $root.google.spanner.executor.v1.GetCloudBackupAction.fromObject(object.getCloudBackup);
                            }
                            if (object.updateCloudBackup != null) {
                                if (typeof object.updateCloudBackup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.updateCloudBackup: object expected");
                                message.updateCloudBackup = $root.google.spanner.executor.v1.UpdateCloudBackupAction.fromObject(object.updateCloudBackup);
                            }
                            if (object.deleteCloudBackup != null) {
                                if (typeof object.deleteCloudBackup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.deleteCloudBackup: object expected");
                                message.deleteCloudBackup = $root.google.spanner.executor.v1.DeleteCloudBackupAction.fromObject(object.deleteCloudBackup);
                            }
                            if (object.listCloudBackups != null) {
                                if (typeof object.listCloudBackups !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listCloudBackups: object expected");
                                message.listCloudBackups = $root.google.spanner.executor.v1.ListCloudBackupsAction.fromObject(object.listCloudBackups);
                            }
                            if (object.listCloudBackupOperations != null) {
                                if (typeof object.listCloudBackupOperations !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.listCloudBackupOperations: object expected");
                                message.listCloudBackupOperations = $root.google.spanner.executor.v1.ListCloudBackupOperationsAction.fromObject(object.listCloudBackupOperations);
                            }
                            if (object.getOperation != null) {
                                if (typeof object.getOperation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.getOperation: object expected");
                                message.getOperation = $root.google.spanner.executor.v1.GetOperationAction.fromObject(object.getOperation);
                            }
                            if (object.cancelOperation != null) {
                                if (typeof object.cancelOperation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.cancelOperation: object expected");
                                message.cancelOperation = $root.google.spanner.executor.v1.CancelOperationAction.fromObject(object.cancelOperation);
                            }
                            if (object.changeQuorumCloudDatabase != null) {
                                if (typeof object.changeQuorumCloudDatabase !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminAction.changeQuorumCloudDatabase: object expected");
                                message.changeQuorumCloudDatabase = $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.fromObject(object.changeQuorumCloudDatabase);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an AdminAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {google.spanner.executor.v1.AdminAction} message AdminAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        AdminAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (message.createUserInstanceConfig != null && message.hasOwnProperty("createUserInstanceConfig")) {
                                object.createUserInstanceConfig = $root.google.spanner.executor.v1.CreateUserInstanceConfigAction.toObject(message.createUserInstanceConfig, options);
                                if (options.oneofs)
                                    object.action = "createUserInstanceConfig";
                            }
                            if (message.updateUserInstanceConfig != null && message.hasOwnProperty("updateUserInstanceConfig")) {
                                object.updateUserInstanceConfig = $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction.toObject(message.updateUserInstanceConfig, options);
                                if (options.oneofs)
                                    object.action = "updateUserInstanceConfig";
                            }
                            if (message.deleteUserInstanceConfig != null && message.hasOwnProperty("deleteUserInstanceConfig")) {
                                object.deleteUserInstanceConfig = $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction.toObject(message.deleteUserInstanceConfig, options);
                                if (options.oneofs)
                                    object.action = "deleteUserInstanceConfig";
                            }
                            if (message.getCloudInstanceConfig != null && message.hasOwnProperty("getCloudInstanceConfig")) {
                                object.getCloudInstanceConfig = $root.google.spanner.executor.v1.GetCloudInstanceConfigAction.toObject(message.getCloudInstanceConfig, options);
                                if (options.oneofs)
                                    object.action = "getCloudInstanceConfig";
                            }
                            if (message.listInstanceConfigs != null && message.hasOwnProperty("listInstanceConfigs")) {
                                object.listInstanceConfigs = $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction.toObject(message.listInstanceConfigs, options);
                                if (options.oneofs)
                                    object.action = "listInstanceConfigs";
                            }
                            if (message.createCloudInstance != null && message.hasOwnProperty("createCloudInstance")) {
                                object.createCloudInstance = $root.google.spanner.executor.v1.CreateCloudInstanceAction.toObject(message.createCloudInstance, options);
                                if (options.oneofs)
                                    object.action = "createCloudInstance";
                            }
                            if (message.updateCloudInstance != null && message.hasOwnProperty("updateCloudInstance")) {
                                object.updateCloudInstance = $root.google.spanner.executor.v1.UpdateCloudInstanceAction.toObject(message.updateCloudInstance, options);
                                if (options.oneofs)
                                    object.action = "updateCloudInstance";
                            }
                            if (message.deleteCloudInstance != null && message.hasOwnProperty("deleteCloudInstance")) {
                                object.deleteCloudInstance = $root.google.spanner.executor.v1.DeleteCloudInstanceAction.toObject(message.deleteCloudInstance, options);
                                if (options.oneofs)
                                    object.action = "deleteCloudInstance";
                            }
                            if (message.listCloudInstances != null && message.hasOwnProperty("listCloudInstances")) {
                                object.listCloudInstances = $root.google.spanner.executor.v1.ListCloudInstancesAction.toObject(message.listCloudInstances, options);
                                if (options.oneofs)
                                    object.action = "listCloudInstances";
                            }
                            if (message.getCloudInstance != null && message.hasOwnProperty("getCloudInstance")) {
                                object.getCloudInstance = $root.google.spanner.executor.v1.GetCloudInstanceAction.toObject(message.getCloudInstance, options);
                                if (options.oneofs)
                                    object.action = "getCloudInstance";
                            }
                            if (message.createCloudDatabase != null && message.hasOwnProperty("createCloudDatabase")) {
                                object.createCloudDatabase = $root.google.spanner.executor.v1.CreateCloudDatabaseAction.toObject(message.createCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "createCloudDatabase";
                            }
                            if (message.updateCloudDatabaseDdl != null && message.hasOwnProperty("updateCloudDatabaseDdl")) {
                                object.updateCloudDatabaseDdl = $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.toObject(message.updateCloudDatabaseDdl, options);
                                if (options.oneofs)
                                    object.action = "updateCloudDatabaseDdl";
                            }
                            if (message.dropCloudDatabase != null && message.hasOwnProperty("dropCloudDatabase")) {
                                object.dropCloudDatabase = $root.google.spanner.executor.v1.DropCloudDatabaseAction.toObject(message.dropCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "dropCloudDatabase";
                            }
                            if (message.listCloudDatabases != null && message.hasOwnProperty("listCloudDatabases")) {
                                object.listCloudDatabases = $root.google.spanner.executor.v1.ListCloudDatabasesAction.toObject(message.listCloudDatabases, options);
                                if (options.oneofs)
                                    object.action = "listCloudDatabases";
                            }
                            if (message.listCloudDatabaseOperations != null && message.hasOwnProperty("listCloudDatabaseOperations")) {
                                object.listCloudDatabaseOperations = $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction.toObject(message.listCloudDatabaseOperations, options);
                                if (options.oneofs)
                                    object.action = "listCloudDatabaseOperations";
                            }
                            if (message.restoreCloudDatabase != null && message.hasOwnProperty("restoreCloudDatabase")) {
                                object.restoreCloudDatabase = $root.google.spanner.executor.v1.RestoreCloudDatabaseAction.toObject(message.restoreCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "restoreCloudDatabase";
                            }
                            if (message.getCloudDatabase != null && message.hasOwnProperty("getCloudDatabase")) {
                                object.getCloudDatabase = $root.google.spanner.executor.v1.GetCloudDatabaseAction.toObject(message.getCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "getCloudDatabase";
                            }
                            if (message.createCloudBackup != null && message.hasOwnProperty("createCloudBackup")) {
                                object.createCloudBackup = $root.google.spanner.executor.v1.CreateCloudBackupAction.toObject(message.createCloudBackup, options);
                                if (options.oneofs)
                                    object.action = "createCloudBackup";
                            }
                            if (message.copyCloudBackup != null && message.hasOwnProperty("copyCloudBackup")) {
                                object.copyCloudBackup = $root.google.spanner.executor.v1.CopyCloudBackupAction.toObject(message.copyCloudBackup, options);
                                if (options.oneofs)
                                    object.action = "copyCloudBackup";
                            }
                            if (message.getCloudBackup != null && message.hasOwnProperty("getCloudBackup")) {
                                object.getCloudBackup = $root.google.spanner.executor.v1.GetCloudBackupAction.toObject(message.getCloudBackup, options);
                                if (options.oneofs)
                                    object.action = "getCloudBackup";
                            }
                            if (message.updateCloudBackup != null && message.hasOwnProperty("updateCloudBackup")) {
                                object.updateCloudBackup = $root.google.spanner.executor.v1.UpdateCloudBackupAction.toObject(message.updateCloudBackup, options);
                                if (options.oneofs)
                                    object.action = "updateCloudBackup";
                            }
                            if (message.deleteCloudBackup != null && message.hasOwnProperty("deleteCloudBackup")) {
                                object.deleteCloudBackup = $root.google.spanner.executor.v1.DeleteCloudBackupAction.toObject(message.deleteCloudBackup, options);
                                if (options.oneofs)
                                    object.action = "deleteCloudBackup";
                            }
                            if (message.listCloudBackups != null && message.hasOwnProperty("listCloudBackups")) {
                                object.listCloudBackups = $root.google.spanner.executor.v1.ListCloudBackupsAction.toObject(message.listCloudBackups, options);
                                if (options.oneofs)
                                    object.action = "listCloudBackups";
                            }
                            if (message.listCloudBackupOperations != null && message.hasOwnProperty("listCloudBackupOperations")) {
                                object.listCloudBackupOperations = $root.google.spanner.executor.v1.ListCloudBackupOperationsAction.toObject(message.listCloudBackupOperations, options);
                                if (options.oneofs)
                                    object.action = "listCloudBackupOperations";
                            }
                            if (message.getOperation != null && message.hasOwnProperty("getOperation")) {
                                object.getOperation = $root.google.spanner.executor.v1.GetOperationAction.toObject(message.getOperation, options);
                                if (options.oneofs)
                                    object.action = "getOperation";
                            }
                            if (message.cancelOperation != null && message.hasOwnProperty("cancelOperation")) {
                                object.cancelOperation = $root.google.spanner.executor.v1.CancelOperationAction.toObject(message.cancelOperation, options);
                                if (options.oneofs)
                                    object.action = "cancelOperation";
                            }
                            if (message.updateCloudDatabase != null && message.hasOwnProperty("updateCloudDatabase")) {
                                object.updateCloudDatabase = $root.google.spanner.executor.v1.UpdateCloudDatabaseAction.toObject(message.updateCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "updateCloudDatabase";
                            }
                            if (message.changeQuorumCloudDatabase != null && message.hasOwnProperty("changeQuorumCloudDatabase")) {
                                object.changeQuorumCloudDatabase = $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.toObject(message.changeQuorumCloudDatabase, options);
                                if (options.oneofs)
                                    object.action = "changeQuorumCloudDatabase";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this AdminAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        AdminAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for AdminAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.AdminAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        AdminAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.AdminAction";
                        };
    
                        return AdminAction;
                    })();
    
                    v1.CreateUserInstanceConfigAction = (function() {
    
                        /**
                         * Properties of a CreateUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICreateUserInstanceConfigAction
                         * @property {string|null} [userConfigId] CreateUserInstanceConfigAction userConfigId
                         * @property {string|null} [projectId] CreateUserInstanceConfigAction projectId
                         * @property {string|null} [baseConfigId] CreateUserInstanceConfigAction baseConfigId
                         * @property {Array.<google.spanner.admin.instance.v1.IReplicaInfo>|null} [replicas] CreateUserInstanceConfigAction replicas
                         */
    
                        /**
                         * Constructs a new CreateUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CreateUserInstanceConfigAction.
                         * @implements ICreateUserInstanceConfigAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICreateUserInstanceConfigAction=} [properties] Properties to set
                         */
                        function CreateUserInstanceConfigAction(properties) {
                            this.replicas = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CreateUserInstanceConfigAction userConfigId.
                         * @member {string} userConfigId
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @instance
                         */
                        CreateUserInstanceConfigAction.prototype.userConfigId = "";
    
                        /**
                         * CreateUserInstanceConfigAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @instance
                         */
                        CreateUserInstanceConfigAction.prototype.projectId = "";
    
                        /**
                         * CreateUserInstanceConfigAction baseConfigId.
                         * @member {string} baseConfigId
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @instance
                         */
                        CreateUserInstanceConfigAction.prototype.baseConfigId = "";
    
                        /**
                         * CreateUserInstanceConfigAction replicas.
                         * @member {Array.<google.spanner.admin.instance.v1.IReplicaInfo>} replicas
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @instance
                         */
                        CreateUserInstanceConfigAction.prototype.replicas = $util.emptyArray;
    
                        /**
                         * Creates a new CreateUserInstanceConfigAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateUserInstanceConfigAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CreateUserInstanceConfigAction} CreateUserInstanceConfigAction instance
                         */
                        CreateUserInstanceConfigAction.create = function create(properties) {
                            return new CreateUserInstanceConfigAction(properties);
                        };
    
                        /**
                         * Encodes the specified CreateUserInstanceConfigAction message. Does not implicitly {@link google.spanner.executor.v1.CreateUserInstanceConfigAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateUserInstanceConfigAction} message CreateUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateUserInstanceConfigAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.userConfigId != null && Object.hasOwnProperty.call(message, "userConfigId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.userConfigId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.baseConfigId != null && Object.hasOwnProperty.call(message, "baseConfigId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.baseConfigId);
                            if (message.replicas != null && message.replicas.length)
                                for (var i = 0; i < message.replicas.length; ++i)
                                    $root.google.spanner.admin.instance.v1.ReplicaInfo.encode(message.replicas[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CreateUserInstanceConfigAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CreateUserInstanceConfigAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateUserInstanceConfigAction} message CreateUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateUserInstanceConfigAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CreateUserInstanceConfigAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CreateUserInstanceConfigAction} CreateUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateUserInstanceConfigAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CreateUserInstanceConfigAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.userConfigId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.baseConfigId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        if (!(message.replicas && message.replicas.length))
                                            message.replicas = [];
                                        message.replicas.push($root.google.spanner.admin.instance.v1.ReplicaInfo.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CreateUserInstanceConfigAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CreateUserInstanceConfigAction} CreateUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateUserInstanceConfigAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CreateUserInstanceConfigAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CreateUserInstanceConfigAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                if (!$util.isString(message.userConfigId))
                                    return "userConfigId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.baseConfigId != null && message.hasOwnProperty("baseConfigId"))
                                if (!$util.isString(message.baseConfigId))
                                    return "baseConfigId: string expected";
                            if (message.replicas != null && message.hasOwnProperty("replicas")) {
                                if (!Array.isArray(message.replicas))
                                    return "replicas: array expected";
                                for (var i = 0; i < message.replicas.length; ++i) {
                                    var error = $root.google.spanner.admin.instance.v1.ReplicaInfo.verify(message.replicas[i]);
                                    if (error)
                                        return "replicas." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CreateUserInstanceConfigAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CreateUserInstanceConfigAction} CreateUserInstanceConfigAction
                         */
                        CreateUserInstanceConfigAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CreateUserInstanceConfigAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CreateUserInstanceConfigAction();
                            if (object.userConfigId != null)
                                message.userConfigId = String(object.userConfigId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.baseConfigId != null)
                                message.baseConfigId = String(object.baseConfigId);
                            if (object.replicas) {
                                if (!Array.isArray(object.replicas))
                                    throw TypeError(".google.spanner.executor.v1.CreateUserInstanceConfigAction.replicas: array expected");
                                message.replicas = [];
                                for (var i = 0; i < object.replicas.length; ++i) {
                                    if (typeof object.replicas[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CreateUserInstanceConfigAction.replicas: object expected");
                                    message.replicas[i] = $root.google.spanner.admin.instance.v1.ReplicaInfo.fromObject(object.replicas[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CreateUserInstanceConfigAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.CreateUserInstanceConfigAction} message CreateUserInstanceConfigAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CreateUserInstanceConfigAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.replicas = [];
                            if (options.defaults) {
                                object.userConfigId = "";
                                object.projectId = "";
                                object.baseConfigId = "";
                            }
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                object.userConfigId = message.userConfigId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.baseConfigId != null && message.hasOwnProperty("baseConfigId"))
                                object.baseConfigId = message.baseConfigId;
                            if (message.replicas && message.replicas.length) {
                                object.replicas = [];
                                for (var j = 0; j < message.replicas.length; ++j)
                                    object.replicas[j] = $root.google.spanner.admin.instance.v1.ReplicaInfo.toObject(message.replicas[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this CreateUserInstanceConfigAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CreateUserInstanceConfigAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CreateUserInstanceConfigAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CreateUserInstanceConfigAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CreateUserInstanceConfigAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CreateUserInstanceConfigAction";
                        };
    
                        return CreateUserInstanceConfigAction;
                    })();
    
                    v1.UpdateUserInstanceConfigAction = (function() {
    
                        /**
                         * Properties of an UpdateUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IUpdateUserInstanceConfigAction
                         * @property {string|null} [userConfigId] UpdateUserInstanceConfigAction userConfigId
                         * @property {string|null} [projectId] UpdateUserInstanceConfigAction projectId
                         * @property {string|null} [displayName] UpdateUserInstanceConfigAction displayName
                         * @property {Object.<string,string>|null} [labels] UpdateUserInstanceConfigAction labels
                         */
    
                        /**
                         * Constructs a new UpdateUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an UpdateUserInstanceConfigAction.
                         * @implements IUpdateUserInstanceConfigAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IUpdateUserInstanceConfigAction=} [properties] Properties to set
                         */
                        function UpdateUserInstanceConfigAction(properties) {
                            this.labels = {};
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * UpdateUserInstanceConfigAction userConfigId.
                         * @member {string} userConfigId
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @instance
                         */
                        UpdateUserInstanceConfigAction.prototype.userConfigId = "";
    
                        /**
                         * UpdateUserInstanceConfigAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @instance
                         */
                        UpdateUserInstanceConfigAction.prototype.projectId = "";
    
                        /**
                         * UpdateUserInstanceConfigAction displayName.
                         * @member {string|null|undefined} displayName
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @instance
                         */
                        UpdateUserInstanceConfigAction.prototype.displayName = null;
    
                        /**
                         * UpdateUserInstanceConfigAction labels.
                         * @member {Object.<string,string>} labels
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @instance
                         */
                        UpdateUserInstanceConfigAction.prototype.labels = $util.emptyObject;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateUserInstanceConfigAction.prototype, "_displayName", {
                            get: $util.oneOfGetter($oneOfFields = ["displayName"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new UpdateUserInstanceConfigAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateUserInstanceConfigAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.UpdateUserInstanceConfigAction} UpdateUserInstanceConfigAction instance
                         */
                        UpdateUserInstanceConfigAction.create = function create(properties) {
                            return new UpdateUserInstanceConfigAction(properties);
                        };
    
                        /**
                         * Encodes the specified UpdateUserInstanceConfigAction message. Does not implicitly {@link google.spanner.executor.v1.UpdateUserInstanceConfigAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateUserInstanceConfigAction} message UpdateUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateUserInstanceConfigAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.userConfigId != null && Object.hasOwnProperty.call(message, "userConfigId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.userConfigId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.displayName);
                            if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                                for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                    writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified UpdateUserInstanceConfigAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.UpdateUserInstanceConfigAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateUserInstanceConfigAction} message UpdateUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateUserInstanceConfigAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an UpdateUserInstanceConfigAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.UpdateUserInstanceConfigAction} UpdateUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateUserInstanceConfigAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction(), key, value;
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.userConfigId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.displayName = reader.string();
                                        break;
                                    }
                                case 4: {
                                        if (message.labels === $util.emptyObject)
                                            message.labels = {};
                                        var end2 = reader.uint32() + reader.pos;
                                        key = "";
                                        value = "";
                                        while (reader.pos < end2) {
                                            var tag2 = reader.uint32();
                                            switch (tag2 >>> 3) {
                                            case 1:
                                                key = reader.string();
                                                break;
                                            case 2:
                                                value = reader.string();
                                                break;
                                            default:
                                                reader.skipType(tag2 & 7);
                                                break;
                                            }
                                        }
                                        message.labels[key] = value;
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an UpdateUserInstanceConfigAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.UpdateUserInstanceConfigAction} UpdateUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateUserInstanceConfigAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an UpdateUserInstanceConfigAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        UpdateUserInstanceConfigAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                if (!$util.isString(message.userConfigId))
                                    return "userConfigId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.displayName != null && message.hasOwnProperty("displayName")) {
                                properties._displayName = 1;
                                if (!$util.isString(message.displayName))
                                    return "displayName: string expected";
                            }
                            if (message.labels != null && message.hasOwnProperty("labels")) {
                                if (!$util.isObject(message.labels))
                                    return "labels: object expected";
                                var key = Object.keys(message.labels);
                                for (var i = 0; i < key.length; ++i)
                                    if (!$util.isString(message.labels[key[i]]))
                                        return "labels: string{k:string} expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates an UpdateUserInstanceConfigAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.UpdateUserInstanceConfigAction} UpdateUserInstanceConfigAction
                         */
                        UpdateUserInstanceConfigAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.UpdateUserInstanceConfigAction();
                            if (object.userConfigId != null)
                                message.userConfigId = String(object.userConfigId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.displayName != null)
                                message.displayName = String(object.displayName);
                            if (object.labels) {
                                if (typeof object.labels !== "object")
                                    throw TypeError(".google.spanner.executor.v1.UpdateUserInstanceConfigAction.labels: object expected");
                                message.labels = {};
                                for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                    message.labels[keys[i]] = String(object.labels[keys[i]]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an UpdateUserInstanceConfigAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.UpdateUserInstanceConfigAction} message UpdateUserInstanceConfigAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        UpdateUserInstanceConfigAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.objects || options.defaults)
                                object.labels = {};
                            if (options.defaults) {
                                object.userConfigId = "";
                                object.projectId = "";
                            }
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                object.userConfigId = message.userConfigId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.displayName != null && message.hasOwnProperty("displayName")) {
                                object.displayName = message.displayName;
                                if (options.oneofs)
                                    object._displayName = "displayName";
                            }
                            var keys2;
                            if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                                object.labels = {};
                                for (var j = 0; j < keys2.length; ++j)
                                    object.labels[keys2[j]] = message.labels[keys2[j]];
                            }
                            return object;
                        };
    
                        /**
                         * Converts this UpdateUserInstanceConfigAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        UpdateUserInstanceConfigAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for UpdateUserInstanceConfigAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.UpdateUserInstanceConfigAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        UpdateUserInstanceConfigAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.UpdateUserInstanceConfigAction";
                        };
    
                        return UpdateUserInstanceConfigAction;
                    })();
    
                    v1.GetCloudInstanceConfigAction = (function() {
    
                        /**
                         * Properties of a GetCloudInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGetCloudInstanceConfigAction
                         * @property {string|null} [instanceConfigId] GetCloudInstanceConfigAction instanceConfigId
                         * @property {string|null} [projectId] GetCloudInstanceConfigAction projectId
                         */
    
                        /**
                         * Constructs a new GetCloudInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GetCloudInstanceConfigAction.
                         * @implements IGetCloudInstanceConfigAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGetCloudInstanceConfigAction=} [properties] Properties to set
                         */
                        function GetCloudInstanceConfigAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GetCloudInstanceConfigAction instanceConfigId.
                         * @member {string} instanceConfigId
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @instance
                         */
                        GetCloudInstanceConfigAction.prototype.instanceConfigId = "";
    
                        /**
                         * GetCloudInstanceConfigAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @instance
                         */
                        GetCloudInstanceConfigAction.prototype.projectId = "";
    
                        /**
                         * Creates a new GetCloudInstanceConfigAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceConfigAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GetCloudInstanceConfigAction} GetCloudInstanceConfigAction instance
                         */
                        GetCloudInstanceConfigAction.create = function create(properties) {
                            return new GetCloudInstanceConfigAction(properties);
                        };
    
                        /**
                         * Encodes the specified GetCloudInstanceConfigAction message. Does not implicitly {@link google.spanner.executor.v1.GetCloudInstanceConfigAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceConfigAction} message GetCloudInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudInstanceConfigAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceConfigId != null && Object.hasOwnProperty.call(message, "instanceConfigId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceConfigId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GetCloudInstanceConfigAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GetCloudInstanceConfigAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceConfigAction} message GetCloudInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudInstanceConfigAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GetCloudInstanceConfigAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GetCloudInstanceConfigAction} GetCloudInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudInstanceConfigAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GetCloudInstanceConfigAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceConfigId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GetCloudInstanceConfigAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GetCloudInstanceConfigAction} GetCloudInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudInstanceConfigAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GetCloudInstanceConfigAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GetCloudInstanceConfigAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                if (!$util.isString(message.instanceConfigId))
                                    return "instanceConfigId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a GetCloudInstanceConfigAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GetCloudInstanceConfigAction} GetCloudInstanceConfigAction
                         */
                        GetCloudInstanceConfigAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GetCloudInstanceConfigAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GetCloudInstanceConfigAction();
                            if (object.instanceConfigId != null)
                                message.instanceConfigId = String(object.instanceConfigId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GetCloudInstanceConfigAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.GetCloudInstanceConfigAction} message GetCloudInstanceConfigAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GetCloudInstanceConfigAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.instanceConfigId = "";
                                object.projectId = "";
                            }
                            if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                object.instanceConfigId = message.instanceConfigId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            return object;
                        };
    
                        /**
                         * Converts this GetCloudInstanceConfigAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GetCloudInstanceConfigAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GetCloudInstanceConfigAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GetCloudInstanceConfigAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GetCloudInstanceConfigAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GetCloudInstanceConfigAction";
                        };
    
                        return GetCloudInstanceConfigAction;
                    })();
    
                    v1.DeleteUserInstanceConfigAction = (function() {
    
                        /**
                         * Properties of a DeleteUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IDeleteUserInstanceConfigAction
                         * @property {string|null} [userConfigId] DeleteUserInstanceConfigAction userConfigId
                         * @property {string|null} [projectId] DeleteUserInstanceConfigAction projectId
                         */
    
                        /**
                         * Constructs a new DeleteUserInstanceConfigAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DeleteUserInstanceConfigAction.
                         * @implements IDeleteUserInstanceConfigAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IDeleteUserInstanceConfigAction=} [properties] Properties to set
                         */
                        function DeleteUserInstanceConfigAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DeleteUserInstanceConfigAction userConfigId.
                         * @member {string} userConfigId
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @instance
                         */
                        DeleteUserInstanceConfigAction.prototype.userConfigId = "";
    
                        /**
                         * DeleteUserInstanceConfigAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @instance
                         */
                        DeleteUserInstanceConfigAction.prototype.projectId = "";
    
                        /**
                         * Creates a new DeleteUserInstanceConfigAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteUserInstanceConfigAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DeleteUserInstanceConfigAction} DeleteUserInstanceConfigAction instance
                         */
                        DeleteUserInstanceConfigAction.create = function create(properties) {
                            return new DeleteUserInstanceConfigAction(properties);
                        };
    
                        /**
                         * Encodes the specified DeleteUserInstanceConfigAction message. Does not implicitly {@link google.spanner.executor.v1.DeleteUserInstanceConfigAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteUserInstanceConfigAction} message DeleteUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteUserInstanceConfigAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.userConfigId != null && Object.hasOwnProperty.call(message, "userConfigId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.userConfigId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DeleteUserInstanceConfigAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DeleteUserInstanceConfigAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteUserInstanceConfigAction} message DeleteUserInstanceConfigAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteUserInstanceConfigAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DeleteUserInstanceConfigAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DeleteUserInstanceConfigAction} DeleteUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteUserInstanceConfigAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.userConfigId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DeleteUserInstanceConfigAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DeleteUserInstanceConfigAction} DeleteUserInstanceConfigAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteUserInstanceConfigAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DeleteUserInstanceConfigAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DeleteUserInstanceConfigAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                if (!$util.isString(message.userConfigId))
                                    return "userConfigId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a DeleteUserInstanceConfigAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DeleteUserInstanceConfigAction} DeleteUserInstanceConfigAction
                         */
                        DeleteUserInstanceConfigAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DeleteUserInstanceConfigAction();
                            if (object.userConfigId != null)
                                message.userConfigId = String(object.userConfigId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DeleteUserInstanceConfigAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {google.spanner.executor.v1.DeleteUserInstanceConfigAction} message DeleteUserInstanceConfigAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DeleteUserInstanceConfigAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.userConfigId = "";
                                object.projectId = "";
                            }
                            if (message.userConfigId != null && message.hasOwnProperty("userConfigId"))
                                object.userConfigId = message.userConfigId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            return object;
                        };
    
                        /**
                         * Converts this DeleteUserInstanceConfigAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DeleteUserInstanceConfigAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DeleteUserInstanceConfigAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DeleteUserInstanceConfigAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DeleteUserInstanceConfigAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DeleteUserInstanceConfigAction";
                        };
    
                        return DeleteUserInstanceConfigAction;
                    })();
    
                    v1.ListCloudInstanceConfigsAction = (function() {
    
                        /**
                         * Properties of a ListCloudInstanceConfigsAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudInstanceConfigsAction
                         * @property {string|null} [projectId] ListCloudInstanceConfigsAction projectId
                         * @property {number|null} [pageSize] ListCloudInstanceConfigsAction pageSize
                         * @property {string|null} [pageToken] ListCloudInstanceConfigsAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudInstanceConfigsAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudInstanceConfigsAction.
                         * @implements IListCloudInstanceConfigsAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudInstanceConfigsAction=} [properties] Properties to set
                         */
                        function ListCloudInstanceConfigsAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudInstanceConfigsAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @instance
                         */
                        ListCloudInstanceConfigsAction.prototype.projectId = "";
    
                        /**
                         * ListCloudInstanceConfigsAction pageSize.
                         * @member {number|null|undefined} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @instance
                         */
                        ListCloudInstanceConfigsAction.prototype.pageSize = null;
    
                        /**
                         * ListCloudInstanceConfigsAction pageToken.
                         * @member {string|null|undefined} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @instance
                         */
                        ListCloudInstanceConfigsAction.prototype.pageToken = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ListCloudInstanceConfigsAction.prototype, "_pageSize", {
                            get: $util.oneOfGetter($oneOfFields = ["pageSize"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ListCloudInstanceConfigsAction.prototype, "_pageToken", {
                            get: $util.oneOfGetter($oneOfFields = ["pageToken"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ListCloudInstanceConfigsAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstanceConfigsAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudInstanceConfigsAction} ListCloudInstanceConfigsAction instance
                         */
                        ListCloudInstanceConfigsAction.create = function create(properties) {
                            return new ListCloudInstanceConfigsAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudInstanceConfigsAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudInstanceConfigsAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstanceConfigsAction} message ListCloudInstanceConfigsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudInstanceConfigsAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudInstanceConfigsAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudInstanceConfigsAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstanceConfigsAction} message ListCloudInstanceConfigsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudInstanceConfigsAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudInstanceConfigsAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudInstanceConfigsAction} ListCloudInstanceConfigsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudInstanceConfigsAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 3: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudInstanceConfigsAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudInstanceConfigsAction} ListCloudInstanceConfigsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudInstanceConfigsAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudInstanceConfigsAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudInstanceConfigsAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.pageSize != null && message.hasOwnProperty("pageSize")) {
                                properties._pageSize = 1;
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            }
                            if (message.pageToken != null && message.hasOwnProperty("pageToken")) {
                                properties._pageToken = 1;
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudInstanceConfigsAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudInstanceConfigsAction} ListCloudInstanceConfigsAction
                         */
                        ListCloudInstanceConfigsAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudInstanceConfigsAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudInstanceConfigsAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudInstanceConfigsAction} message ListCloudInstanceConfigsAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudInstanceConfigsAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.projectId = "";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.pageSize != null && message.hasOwnProperty("pageSize")) {
                                object.pageSize = message.pageSize;
                                if (options.oneofs)
                                    object._pageSize = "pageSize";
                            }
                            if (message.pageToken != null && message.hasOwnProperty("pageToken")) {
                                object.pageToken = message.pageToken;
                                if (options.oneofs)
                                    object._pageToken = "pageToken";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudInstanceConfigsAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudInstanceConfigsAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudInstanceConfigsAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudInstanceConfigsAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudInstanceConfigsAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudInstanceConfigsAction";
                        };
    
                        return ListCloudInstanceConfigsAction;
                    })();
    
                    v1.CreateCloudInstanceAction = (function() {
    
                        /**
                         * Properties of a CreateCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICreateCloudInstanceAction
                         * @property {string|null} [instanceId] CreateCloudInstanceAction instanceId
                         * @property {string|null} [projectId] CreateCloudInstanceAction projectId
                         * @property {string|null} [instanceConfigId] CreateCloudInstanceAction instanceConfigId
                         * @property {number|null} [nodeCount] CreateCloudInstanceAction nodeCount
                         * @property {number|null} [processingUnits] CreateCloudInstanceAction processingUnits
                         * @property {google.spanner.admin.instance.v1.IAutoscalingConfig|null} [autoscalingConfig] CreateCloudInstanceAction autoscalingConfig
                         * @property {Object.<string,string>|null} [labels] CreateCloudInstanceAction labels
                         */
    
                        /**
                         * Constructs a new CreateCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CreateCloudInstanceAction.
                         * @implements ICreateCloudInstanceAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICreateCloudInstanceAction=} [properties] Properties to set
                         */
                        function CreateCloudInstanceAction(properties) {
                            this.labels = {};
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CreateCloudInstanceAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.instanceId = "";
    
                        /**
                         * CreateCloudInstanceAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.projectId = "";
    
                        /**
                         * CreateCloudInstanceAction instanceConfigId.
                         * @member {string} instanceConfigId
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.instanceConfigId = "";
    
                        /**
                         * CreateCloudInstanceAction nodeCount.
                         * @member {number|null|undefined} nodeCount
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.nodeCount = null;
    
                        /**
                         * CreateCloudInstanceAction processingUnits.
                         * @member {number|null|undefined} processingUnits
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.processingUnits = null;
    
                        /**
                         * CreateCloudInstanceAction autoscalingConfig.
                         * @member {google.spanner.admin.instance.v1.IAutoscalingConfig|null|undefined} autoscalingConfig
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.autoscalingConfig = null;
    
                        /**
                         * CreateCloudInstanceAction labels.
                         * @member {Object.<string,string>} labels
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         */
                        CreateCloudInstanceAction.prototype.labels = $util.emptyObject;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudInstanceAction.prototype, "_nodeCount", {
                            get: $util.oneOfGetter($oneOfFields = ["nodeCount"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudInstanceAction.prototype, "_processingUnits", {
                            get: $util.oneOfGetter($oneOfFields = ["processingUnits"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudInstanceAction.prototype, "_autoscalingConfig", {
                            get: $util.oneOfGetter($oneOfFields = ["autoscalingConfig"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new CreateCloudInstanceAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudInstanceAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CreateCloudInstanceAction} CreateCloudInstanceAction instance
                         */
                        CreateCloudInstanceAction.create = function create(properties) {
                            return new CreateCloudInstanceAction(properties);
                        };
    
                        /**
                         * Encodes the specified CreateCloudInstanceAction message. Does not implicitly {@link google.spanner.executor.v1.CreateCloudInstanceAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudInstanceAction} message CreateCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudInstanceAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.instanceConfigId != null && Object.hasOwnProperty.call(message, "instanceConfigId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.instanceConfigId);
                            if (message.nodeCount != null && Object.hasOwnProperty.call(message, "nodeCount"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.nodeCount);
                            if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                                for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                    writer.uint32(/* id 5, wireType 2 =*/42).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                            if (message.processingUnits != null && Object.hasOwnProperty.call(message, "processingUnits"))
                                writer.uint32(/* id 6, wireType 0 =*/48).int32(message.processingUnits);
                            if (message.autoscalingConfig != null && Object.hasOwnProperty.call(message, "autoscalingConfig"))
                                $root.google.spanner.admin.instance.v1.AutoscalingConfig.encode(message.autoscalingConfig, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CreateCloudInstanceAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CreateCloudInstanceAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudInstanceAction} message CreateCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudInstanceAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CreateCloudInstanceAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CreateCloudInstanceAction} CreateCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudInstanceAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CreateCloudInstanceAction(), key, value;
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.instanceConfigId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.nodeCount = reader.int32();
                                        break;
                                    }
                                case 6: {
                                        message.processingUnits = reader.int32();
                                        break;
                                    }
                                case 7: {
                                        message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        if (message.labels === $util.emptyObject)
                                            message.labels = {};
                                        var end2 = reader.uint32() + reader.pos;
                                        key = "";
                                        value = "";
                                        while (reader.pos < end2) {
                                            var tag2 = reader.uint32();
                                            switch (tag2 >>> 3) {
                                            case 1:
                                                key = reader.string();
                                                break;
                                            case 2:
                                                value = reader.string();
                                                break;
                                            default:
                                                reader.skipType(tag2 & 7);
                                                break;
                                            }
                                        }
                                        message.labels[key] = value;
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CreateCloudInstanceAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CreateCloudInstanceAction} CreateCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudInstanceAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CreateCloudInstanceAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CreateCloudInstanceAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                if (!$util.isString(message.instanceConfigId))
                                    return "instanceConfigId: string expected";
                            if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                properties._nodeCount = 1;
                                if (!$util.isInteger(message.nodeCount))
                                    return "nodeCount: integer expected";
                            }
                            if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                properties._processingUnits = 1;
                                if (!$util.isInteger(message.processingUnits))
                                    return "processingUnits: integer expected";
                            }
                            if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                properties._autoscalingConfig = 1;
                                {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.verify(message.autoscalingConfig);
                                    if (error)
                                        return "autoscalingConfig." + error;
                                }
                            }
                            if (message.labels != null && message.hasOwnProperty("labels")) {
                                if (!$util.isObject(message.labels))
                                    return "labels: object expected";
                                var key = Object.keys(message.labels);
                                for (var i = 0; i < key.length; ++i)
                                    if (!$util.isString(message.labels[key[i]]))
                                        return "labels: string{k:string} expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CreateCloudInstanceAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CreateCloudInstanceAction} CreateCloudInstanceAction
                         */
                        CreateCloudInstanceAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CreateCloudInstanceAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CreateCloudInstanceAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceConfigId != null)
                                message.instanceConfigId = String(object.instanceConfigId);
                            if (object.nodeCount != null)
                                message.nodeCount = object.nodeCount | 0;
                            if (object.processingUnits != null)
                                message.processingUnits = object.processingUnits | 0;
                            if (object.autoscalingConfig != null) {
                                if (typeof object.autoscalingConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudInstanceAction.autoscalingConfig: object expected");
                                message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.fromObject(object.autoscalingConfig);
                            }
                            if (object.labels) {
                                if (typeof object.labels !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudInstanceAction.labels: object expected");
                                message.labels = {};
                                for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                    message.labels[keys[i]] = String(object.labels[keys[i]]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CreateCloudInstanceAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.CreateCloudInstanceAction} message CreateCloudInstanceAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CreateCloudInstanceAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.objects || options.defaults)
                                object.labels = {};
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                                object.instanceConfigId = "";
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceConfigId != null && message.hasOwnProperty("instanceConfigId"))
                                object.instanceConfigId = message.instanceConfigId;
                            if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                object.nodeCount = message.nodeCount;
                                if (options.oneofs)
                                    object._nodeCount = "nodeCount";
                            }
                            var keys2;
                            if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                                object.labels = {};
                                for (var j = 0; j < keys2.length; ++j)
                                    object.labels[keys2[j]] = message.labels[keys2[j]];
                            }
                            if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                object.processingUnits = message.processingUnits;
                                if (options.oneofs)
                                    object._processingUnits = "processingUnits";
                            }
                            if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                object.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.toObject(message.autoscalingConfig, options);
                                if (options.oneofs)
                                    object._autoscalingConfig = "autoscalingConfig";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this CreateCloudInstanceAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CreateCloudInstanceAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CreateCloudInstanceAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CreateCloudInstanceAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CreateCloudInstanceAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CreateCloudInstanceAction";
                        };
    
                        return CreateCloudInstanceAction;
                    })();
    
                    v1.UpdateCloudInstanceAction = (function() {
    
                        /**
                         * Properties of an UpdateCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IUpdateCloudInstanceAction
                         * @property {string|null} [instanceId] UpdateCloudInstanceAction instanceId
                         * @property {string|null} [projectId] UpdateCloudInstanceAction projectId
                         * @property {string|null} [displayName] UpdateCloudInstanceAction displayName
                         * @property {number|null} [nodeCount] UpdateCloudInstanceAction nodeCount
                         * @property {number|null} [processingUnits] UpdateCloudInstanceAction processingUnits
                         * @property {google.spanner.admin.instance.v1.IAutoscalingConfig|null} [autoscalingConfig] UpdateCloudInstanceAction autoscalingConfig
                         * @property {Object.<string,string>|null} [labels] UpdateCloudInstanceAction labels
                         */
    
                        /**
                         * Constructs a new UpdateCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an UpdateCloudInstanceAction.
                         * @implements IUpdateCloudInstanceAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IUpdateCloudInstanceAction=} [properties] Properties to set
                         */
                        function UpdateCloudInstanceAction(properties) {
                            this.labels = {};
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * UpdateCloudInstanceAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.instanceId = "";
    
                        /**
                         * UpdateCloudInstanceAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.projectId = "";
    
                        /**
                         * UpdateCloudInstanceAction displayName.
                         * @member {string|null|undefined} displayName
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.displayName = null;
    
                        /**
                         * UpdateCloudInstanceAction nodeCount.
                         * @member {number|null|undefined} nodeCount
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.nodeCount = null;
    
                        /**
                         * UpdateCloudInstanceAction processingUnits.
                         * @member {number|null|undefined} processingUnits
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.processingUnits = null;
    
                        /**
                         * UpdateCloudInstanceAction autoscalingConfig.
                         * @member {google.spanner.admin.instance.v1.IAutoscalingConfig|null|undefined} autoscalingConfig
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.autoscalingConfig = null;
    
                        /**
                         * UpdateCloudInstanceAction labels.
                         * @member {Object.<string,string>} labels
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         */
                        UpdateCloudInstanceAction.prototype.labels = $util.emptyObject;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateCloudInstanceAction.prototype, "_displayName", {
                            get: $util.oneOfGetter($oneOfFields = ["displayName"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateCloudInstanceAction.prototype, "_nodeCount", {
                            get: $util.oneOfGetter($oneOfFields = ["nodeCount"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateCloudInstanceAction.prototype, "_processingUnits", {
                            get: $util.oneOfGetter($oneOfFields = ["processingUnits"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateCloudInstanceAction.prototype, "_autoscalingConfig", {
                            get: $util.oneOfGetter($oneOfFields = ["autoscalingConfig"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new UpdateCloudInstanceAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudInstanceAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.UpdateCloudInstanceAction} UpdateCloudInstanceAction instance
                         */
                        UpdateCloudInstanceAction.create = function create(properties) {
                            return new UpdateCloudInstanceAction(properties);
                        };
    
                        /**
                         * Encodes the specified UpdateCloudInstanceAction message. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudInstanceAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudInstanceAction} message UpdateCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudInstanceAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.displayName);
                            if (message.nodeCount != null && Object.hasOwnProperty.call(message, "nodeCount"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.nodeCount);
                            if (message.processingUnits != null && Object.hasOwnProperty.call(message, "processingUnits"))
                                writer.uint32(/* id 5, wireType 0 =*/40).int32(message.processingUnits);
                            if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                                for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                    writer.uint32(/* id 6, wireType 2 =*/50).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                            if (message.autoscalingConfig != null && Object.hasOwnProperty.call(message, "autoscalingConfig"))
                                $root.google.spanner.admin.instance.v1.AutoscalingConfig.encode(message.autoscalingConfig, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified UpdateCloudInstanceAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudInstanceAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudInstanceAction} message UpdateCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudInstanceAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an UpdateCloudInstanceAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.UpdateCloudInstanceAction} UpdateCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudInstanceAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.UpdateCloudInstanceAction(), key, value;
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.displayName = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.nodeCount = reader.int32();
                                        break;
                                    }
                                case 5: {
                                        message.processingUnits = reader.int32();
                                        break;
                                    }
                                case 7: {
                                        message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 6: {
                                        if (message.labels === $util.emptyObject)
                                            message.labels = {};
                                        var end2 = reader.uint32() + reader.pos;
                                        key = "";
                                        value = "";
                                        while (reader.pos < end2) {
                                            var tag2 = reader.uint32();
                                            switch (tag2 >>> 3) {
                                            case 1:
                                                key = reader.string();
                                                break;
                                            case 2:
                                                value = reader.string();
                                                break;
                                            default:
                                                reader.skipType(tag2 & 7);
                                                break;
                                            }
                                        }
                                        message.labels[key] = value;
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an UpdateCloudInstanceAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.UpdateCloudInstanceAction} UpdateCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudInstanceAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an UpdateCloudInstanceAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        UpdateCloudInstanceAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.displayName != null && message.hasOwnProperty("displayName")) {
                                properties._displayName = 1;
                                if (!$util.isString(message.displayName))
                                    return "displayName: string expected";
                            }
                            if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                properties._nodeCount = 1;
                                if (!$util.isInteger(message.nodeCount))
                                    return "nodeCount: integer expected";
                            }
                            if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                properties._processingUnits = 1;
                                if (!$util.isInteger(message.processingUnits))
                                    return "processingUnits: integer expected";
                            }
                            if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                properties._autoscalingConfig = 1;
                                {
                                    var error = $root.google.spanner.admin.instance.v1.AutoscalingConfig.verify(message.autoscalingConfig);
                                    if (error)
                                        return "autoscalingConfig." + error;
                                }
                            }
                            if (message.labels != null && message.hasOwnProperty("labels")) {
                                if (!$util.isObject(message.labels))
                                    return "labels: object expected";
                                var key = Object.keys(message.labels);
                                for (var i = 0; i < key.length; ++i)
                                    if (!$util.isString(message.labels[key[i]]))
                                        return "labels: string{k:string} expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates an UpdateCloudInstanceAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.UpdateCloudInstanceAction} UpdateCloudInstanceAction
                         */
                        UpdateCloudInstanceAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.UpdateCloudInstanceAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.UpdateCloudInstanceAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.displayName != null)
                                message.displayName = String(object.displayName);
                            if (object.nodeCount != null)
                                message.nodeCount = object.nodeCount | 0;
                            if (object.processingUnits != null)
                                message.processingUnits = object.processingUnits | 0;
                            if (object.autoscalingConfig != null) {
                                if (typeof object.autoscalingConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.UpdateCloudInstanceAction.autoscalingConfig: object expected");
                                message.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.fromObject(object.autoscalingConfig);
                            }
                            if (object.labels) {
                                if (typeof object.labels !== "object")
                                    throw TypeError(".google.spanner.executor.v1.UpdateCloudInstanceAction.labels: object expected");
                                message.labels = {};
                                for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                    message.labels[keys[i]] = String(object.labels[keys[i]]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an UpdateCloudInstanceAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.UpdateCloudInstanceAction} message UpdateCloudInstanceAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        UpdateCloudInstanceAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.objects || options.defaults)
                                object.labels = {};
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.displayName != null && message.hasOwnProperty("displayName")) {
                                object.displayName = message.displayName;
                                if (options.oneofs)
                                    object._displayName = "displayName";
                            }
                            if (message.nodeCount != null && message.hasOwnProperty("nodeCount")) {
                                object.nodeCount = message.nodeCount;
                                if (options.oneofs)
                                    object._nodeCount = "nodeCount";
                            }
                            if (message.processingUnits != null && message.hasOwnProperty("processingUnits")) {
                                object.processingUnits = message.processingUnits;
                                if (options.oneofs)
                                    object._processingUnits = "processingUnits";
                            }
                            var keys2;
                            if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                                object.labels = {};
                                for (var j = 0; j < keys2.length; ++j)
                                    object.labels[keys2[j]] = message.labels[keys2[j]];
                            }
                            if (message.autoscalingConfig != null && message.hasOwnProperty("autoscalingConfig")) {
                                object.autoscalingConfig = $root.google.spanner.admin.instance.v1.AutoscalingConfig.toObject(message.autoscalingConfig, options);
                                if (options.oneofs)
                                    object._autoscalingConfig = "autoscalingConfig";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this UpdateCloudInstanceAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        UpdateCloudInstanceAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for UpdateCloudInstanceAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.UpdateCloudInstanceAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        UpdateCloudInstanceAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.UpdateCloudInstanceAction";
                        };
    
                        return UpdateCloudInstanceAction;
                    })();
    
                    v1.DeleteCloudInstanceAction = (function() {
    
                        /**
                         * Properties of a DeleteCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IDeleteCloudInstanceAction
                         * @property {string|null} [instanceId] DeleteCloudInstanceAction instanceId
                         * @property {string|null} [projectId] DeleteCloudInstanceAction projectId
                         */
    
                        /**
                         * Constructs a new DeleteCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DeleteCloudInstanceAction.
                         * @implements IDeleteCloudInstanceAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IDeleteCloudInstanceAction=} [properties] Properties to set
                         */
                        function DeleteCloudInstanceAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DeleteCloudInstanceAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @instance
                         */
                        DeleteCloudInstanceAction.prototype.instanceId = "";
    
                        /**
                         * DeleteCloudInstanceAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @instance
                         */
                        DeleteCloudInstanceAction.prototype.projectId = "";
    
                        /**
                         * Creates a new DeleteCloudInstanceAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudInstanceAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DeleteCloudInstanceAction} DeleteCloudInstanceAction instance
                         */
                        DeleteCloudInstanceAction.create = function create(properties) {
                            return new DeleteCloudInstanceAction(properties);
                        };
    
                        /**
                         * Encodes the specified DeleteCloudInstanceAction message. Does not implicitly {@link google.spanner.executor.v1.DeleteCloudInstanceAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudInstanceAction} message DeleteCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteCloudInstanceAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DeleteCloudInstanceAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DeleteCloudInstanceAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudInstanceAction} message DeleteCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteCloudInstanceAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DeleteCloudInstanceAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DeleteCloudInstanceAction} DeleteCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteCloudInstanceAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DeleteCloudInstanceAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DeleteCloudInstanceAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DeleteCloudInstanceAction} DeleteCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteCloudInstanceAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DeleteCloudInstanceAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DeleteCloudInstanceAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a DeleteCloudInstanceAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DeleteCloudInstanceAction} DeleteCloudInstanceAction
                         */
                        DeleteCloudInstanceAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DeleteCloudInstanceAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DeleteCloudInstanceAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DeleteCloudInstanceAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.DeleteCloudInstanceAction} message DeleteCloudInstanceAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DeleteCloudInstanceAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            return object;
                        };
    
                        /**
                         * Converts this DeleteCloudInstanceAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DeleteCloudInstanceAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DeleteCloudInstanceAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DeleteCloudInstanceAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DeleteCloudInstanceAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DeleteCloudInstanceAction";
                        };
    
                        return DeleteCloudInstanceAction;
                    })();
    
                    v1.CreateCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of a CreateCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICreateCloudDatabaseAction
                         * @property {string|null} [instanceId] CreateCloudDatabaseAction instanceId
                         * @property {string|null} [projectId] CreateCloudDatabaseAction projectId
                         * @property {string|null} [databaseId] CreateCloudDatabaseAction databaseId
                         * @property {Array.<string>|null} [sdlStatement] CreateCloudDatabaseAction sdlStatement
                         * @property {google.spanner.admin.database.v1.IEncryptionConfig|null} [encryptionConfig] CreateCloudDatabaseAction encryptionConfig
                         * @property {string|null} [dialect] CreateCloudDatabaseAction dialect
                         * @property {Uint8Array|null} [protoDescriptors] CreateCloudDatabaseAction protoDescriptors
                         */
    
                        /**
                         * Constructs a new CreateCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CreateCloudDatabaseAction.
                         * @implements ICreateCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICreateCloudDatabaseAction=} [properties] Properties to set
                         */
                        function CreateCloudDatabaseAction(properties) {
                            this.sdlStatement = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CreateCloudDatabaseAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.instanceId = "";
    
                        /**
                         * CreateCloudDatabaseAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.projectId = "";
    
                        /**
                         * CreateCloudDatabaseAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.databaseId = "";
    
                        /**
                         * CreateCloudDatabaseAction sdlStatement.
                         * @member {Array.<string>} sdlStatement
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.sdlStatement = $util.emptyArray;
    
                        /**
                         * CreateCloudDatabaseAction encryptionConfig.
                         * @member {google.spanner.admin.database.v1.IEncryptionConfig|null|undefined} encryptionConfig
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.encryptionConfig = null;
    
                        /**
                         * CreateCloudDatabaseAction dialect.
                         * @member {string|null|undefined} dialect
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.dialect = null;
    
                        /**
                         * CreateCloudDatabaseAction protoDescriptors.
                         * @member {Uint8Array|null|undefined} protoDescriptors
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         */
                        CreateCloudDatabaseAction.prototype.protoDescriptors = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudDatabaseAction.prototype, "_dialect", {
                            get: $util.oneOfGetter($oneOfFields = ["dialect"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudDatabaseAction.prototype, "_protoDescriptors", {
                            get: $util.oneOfGetter($oneOfFields = ["protoDescriptors"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new CreateCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CreateCloudDatabaseAction} CreateCloudDatabaseAction instance
                         */
                        CreateCloudDatabaseAction.create = function create(properties) {
                            return new CreateCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified CreateCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.CreateCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudDatabaseAction} message CreateCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.databaseId);
                            if (message.sdlStatement != null && message.sdlStatement.length)
                                for (var i = 0; i < message.sdlStatement.length; ++i)
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.sdlStatement[i]);
                            if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                $root.google.spanner.admin.database.v1.EncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            if (message.dialect != null && Object.hasOwnProperty.call(message, "dialect"))
                                writer.uint32(/* id 6, wireType 2 =*/50).string(message.dialect);
                            if (message.protoDescriptors != null && Object.hasOwnProperty.call(message, "protoDescriptors"))
                                writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.protoDescriptors);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CreateCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CreateCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudDatabaseAction} message CreateCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CreateCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CreateCloudDatabaseAction} CreateCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CreateCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        if (!(message.sdlStatement && message.sdlStatement.length))
                                            message.sdlStatement = [];
                                        message.sdlStatement.push(reader.string());
                                        break;
                                    }
                                case 5: {
                                        message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 6: {
                                        message.dialect = reader.string();
                                        break;
                                    }
                                case 7: {
                                        message.protoDescriptors = reader.bytes();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CreateCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CreateCloudDatabaseAction} CreateCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CreateCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CreateCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            if (message.sdlStatement != null && message.hasOwnProperty("sdlStatement")) {
                                if (!Array.isArray(message.sdlStatement))
                                    return "sdlStatement: array expected";
                                for (var i = 0; i < message.sdlStatement.length; ++i)
                                    if (!$util.isString(message.sdlStatement[i]))
                                        return "sdlStatement: string[] expected";
                            }
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                var error = $root.google.spanner.admin.database.v1.EncryptionConfig.verify(message.encryptionConfig);
                                if (error)
                                    return "encryptionConfig." + error;
                            }
                            if (message.dialect != null && message.hasOwnProperty("dialect")) {
                                properties._dialect = 1;
                                if (!$util.isString(message.dialect))
                                    return "dialect: string expected";
                            }
                            if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors")) {
                                properties._protoDescriptors = 1;
                                if (!(message.protoDescriptors && typeof message.protoDescriptors.length === "number" || $util.isString(message.protoDescriptors)))
                                    return "protoDescriptors: buffer expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CreateCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CreateCloudDatabaseAction} CreateCloudDatabaseAction
                         */
                        CreateCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CreateCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CreateCloudDatabaseAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            if (object.sdlStatement) {
                                if (!Array.isArray(object.sdlStatement))
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudDatabaseAction.sdlStatement: array expected");
                                message.sdlStatement = [];
                                for (var i = 0; i < object.sdlStatement.length; ++i)
                                    message.sdlStatement[i] = String(object.sdlStatement[i]);
                            }
                            if (object.encryptionConfig != null) {
                                if (typeof object.encryptionConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudDatabaseAction.encryptionConfig: object expected");
                                message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.fromObject(object.encryptionConfig);
                            }
                            if (object.dialect != null)
                                message.dialect = String(object.dialect);
                            if (object.protoDescriptors != null)
                                if (typeof object.protoDescriptors === "string")
                                    $util.base64.decode(object.protoDescriptors, message.protoDescriptors = $util.newBuffer($util.base64.length(object.protoDescriptors)), 0);
                                else if (object.protoDescriptors.length >= 0)
                                    message.protoDescriptors = object.protoDescriptors;
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CreateCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.CreateCloudDatabaseAction} message CreateCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CreateCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.sdlStatement = [];
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                                object.databaseId = "";
                                object.encryptionConfig = null;
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            if (message.sdlStatement && message.sdlStatement.length) {
                                object.sdlStatement = [];
                                for (var j = 0; j < message.sdlStatement.length; ++j)
                                    object.sdlStatement[j] = message.sdlStatement[j];
                            }
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                object.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.toObject(message.encryptionConfig, options);
                            if (message.dialect != null && message.hasOwnProperty("dialect")) {
                                object.dialect = message.dialect;
                                if (options.oneofs)
                                    object._dialect = "dialect";
                            }
                            if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors")) {
                                object.protoDescriptors = options.bytes === String ? $util.base64.encode(message.protoDescriptors, 0, message.protoDescriptors.length) : options.bytes === Array ? Array.prototype.slice.call(message.protoDescriptors) : message.protoDescriptors;
                                if (options.oneofs)
                                    object._protoDescriptors = "protoDescriptors";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this CreateCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CreateCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CreateCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CreateCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CreateCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CreateCloudDatabaseAction";
                        };
    
                        return CreateCloudDatabaseAction;
                    })();
    
                    v1.UpdateCloudDatabaseDdlAction = (function() {
    
                        /**
                         * Properties of an UpdateCloudDatabaseDdlAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IUpdateCloudDatabaseDdlAction
                         * @property {string|null} [instanceId] UpdateCloudDatabaseDdlAction instanceId
                         * @property {string|null} [projectId] UpdateCloudDatabaseDdlAction projectId
                         * @property {string|null} [databaseId] UpdateCloudDatabaseDdlAction databaseId
                         * @property {Array.<string>|null} [sdlStatement] UpdateCloudDatabaseDdlAction sdlStatement
                         * @property {string|null} [operationId] UpdateCloudDatabaseDdlAction operationId
                         * @property {Uint8Array|null} [protoDescriptors] UpdateCloudDatabaseDdlAction protoDescriptors
                         */
    
                        /**
                         * Constructs a new UpdateCloudDatabaseDdlAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an UpdateCloudDatabaseDdlAction.
                         * @implements IUpdateCloudDatabaseDdlAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction=} [properties] Properties to set
                         */
                        function UpdateCloudDatabaseDdlAction(properties) {
                            this.sdlStatement = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * UpdateCloudDatabaseDdlAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.instanceId = "";
    
                        /**
                         * UpdateCloudDatabaseDdlAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.projectId = "";
    
                        /**
                         * UpdateCloudDatabaseDdlAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.databaseId = "";
    
                        /**
                         * UpdateCloudDatabaseDdlAction sdlStatement.
                         * @member {Array.<string>} sdlStatement
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.sdlStatement = $util.emptyArray;
    
                        /**
                         * UpdateCloudDatabaseDdlAction operationId.
                         * @member {string} operationId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.operationId = "";
    
                        /**
                         * UpdateCloudDatabaseDdlAction protoDescriptors.
                         * @member {Uint8Array|null|undefined} protoDescriptors
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         */
                        UpdateCloudDatabaseDdlAction.prototype.protoDescriptors = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(UpdateCloudDatabaseDdlAction.prototype, "_protoDescriptors", {
                            get: $util.oneOfGetter($oneOfFields = ["protoDescriptors"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new UpdateCloudDatabaseDdlAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseDdlAction} UpdateCloudDatabaseDdlAction instance
                         */
                        UpdateCloudDatabaseDdlAction.create = function create(properties) {
                            return new UpdateCloudDatabaseDdlAction(properties);
                        };
    
                        /**
                         * Encodes the specified UpdateCloudDatabaseDdlAction message. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction} message UpdateCloudDatabaseDdlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudDatabaseDdlAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.databaseId);
                            if (message.sdlStatement != null && message.sdlStatement.length)
                                for (var i = 0; i < message.sdlStatement.length; ++i)
                                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.sdlStatement[i]);
                            if (message.operationId != null && Object.hasOwnProperty.call(message, "operationId"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.operationId);
                            if (message.protoDescriptors != null && Object.hasOwnProperty.call(message, "protoDescriptors"))
                                writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.protoDescriptors);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified UpdateCloudDatabaseDdlAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseDdlAction} message UpdateCloudDatabaseDdlAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudDatabaseDdlAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an UpdateCloudDatabaseDdlAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseDdlAction} UpdateCloudDatabaseDdlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudDatabaseDdlAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        if (!(message.sdlStatement && message.sdlStatement.length))
                                            message.sdlStatement = [];
                                        message.sdlStatement.push(reader.string());
                                        break;
                                    }
                                case 5: {
                                        message.operationId = reader.string();
                                        break;
                                    }
                                case 6: {
                                        message.protoDescriptors = reader.bytes();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an UpdateCloudDatabaseDdlAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseDdlAction} UpdateCloudDatabaseDdlAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudDatabaseDdlAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an UpdateCloudDatabaseDdlAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        UpdateCloudDatabaseDdlAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            if (message.sdlStatement != null && message.hasOwnProperty("sdlStatement")) {
                                if (!Array.isArray(message.sdlStatement))
                                    return "sdlStatement: array expected";
                                for (var i = 0; i < message.sdlStatement.length; ++i)
                                    if (!$util.isString(message.sdlStatement[i]))
                                        return "sdlStatement: string[] expected";
                            }
                            if (message.operationId != null && message.hasOwnProperty("operationId"))
                                if (!$util.isString(message.operationId))
                                    return "operationId: string expected";
                            if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors")) {
                                properties._protoDescriptors = 1;
                                if (!(message.protoDescriptors && typeof message.protoDescriptors.length === "number" || $util.isString(message.protoDescriptors)))
                                    return "protoDescriptors: buffer expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates an UpdateCloudDatabaseDdlAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseDdlAction} UpdateCloudDatabaseDdlAction
                         */
                        UpdateCloudDatabaseDdlAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.UpdateCloudDatabaseDdlAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            if (object.sdlStatement) {
                                if (!Array.isArray(object.sdlStatement))
                                    throw TypeError(".google.spanner.executor.v1.UpdateCloudDatabaseDdlAction.sdlStatement: array expected");
                                message.sdlStatement = [];
                                for (var i = 0; i < object.sdlStatement.length; ++i)
                                    message.sdlStatement[i] = String(object.sdlStatement[i]);
                            }
                            if (object.operationId != null)
                                message.operationId = String(object.operationId);
                            if (object.protoDescriptors != null)
                                if (typeof object.protoDescriptors === "string")
                                    $util.base64.decode(object.protoDescriptors, message.protoDescriptors = $util.newBuffer($util.base64.length(object.protoDescriptors)), 0);
                                else if (object.protoDescriptors.length >= 0)
                                    message.protoDescriptors = object.protoDescriptors;
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an UpdateCloudDatabaseDdlAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {google.spanner.executor.v1.UpdateCloudDatabaseDdlAction} message UpdateCloudDatabaseDdlAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        UpdateCloudDatabaseDdlAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.sdlStatement = [];
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                                object.databaseId = "";
                                object.operationId = "";
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            if (message.sdlStatement && message.sdlStatement.length) {
                                object.sdlStatement = [];
                                for (var j = 0; j < message.sdlStatement.length; ++j)
                                    object.sdlStatement[j] = message.sdlStatement[j];
                            }
                            if (message.operationId != null && message.hasOwnProperty("operationId"))
                                object.operationId = message.operationId;
                            if (message.protoDescriptors != null && message.hasOwnProperty("protoDescriptors")) {
                                object.protoDescriptors = options.bytes === String ? $util.base64.encode(message.protoDescriptors, 0, message.protoDescriptors.length) : options.bytes === Array ? Array.prototype.slice.call(message.protoDescriptors) : message.protoDescriptors;
                                if (options.oneofs)
                                    object._protoDescriptors = "protoDescriptors";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this UpdateCloudDatabaseDdlAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        UpdateCloudDatabaseDdlAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for UpdateCloudDatabaseDdlAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseDdlAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        UpdateCloudDatabaseDdlAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.UpdateCloudDatabaseDdlAction";
                        };
    
                        return UpdateCloudDatabaseDdlAction;
                    })();
    
                    v1.UpdateCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of an UpdateCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IUpdateCloudDatabaseAction
                         * @property {string|null} [instanceId] UpdateCloudDatabaseAction instanceId
                         * @property {string|null} [projectId] UpdateCloudDatabaseAction projectId
                         * @property {string|null} [databaseName] UpdateCloudDatabaseAction databaseName
                         * @property {boolean|null} [enableDropProtection] UpdateCloudDatabaseAction enableDropProtection
                         */
    
                        /**
                         * Constructs a new UpdateCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an UpdateCloudDatabaseAction.
                         * @implements IUpdateCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseAction=} [properties] Properties to set
                         */
                        function UpdateCloudDatabaseAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * UpdateCloudDatabaseAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @instance
                         */
                        UpdateCloudDatabaseAction.prototype.instanceId = "";
    
                        /**
                         * UpdateCloudDatabaseAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @instance
                         */
                        UpdateCloudDatabaseAction.prototype.projectId = "";
    
                        /**
                         * UpdateCloudDatabaseAction databaseName.
                         * @member {string} databaseName
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @instance
                         */
                        UpdateCloudDatabaseAction.prototype.databaseName = "";
    
                        /**
                         * UpdateCloudDatabaseAction enableDropProtection.
                         * @member {boolean} enableDropProtection
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @instance
                         */
                        UpdateCloudDatabaseAction.prototype.enableDropProtection = false;
    
                        /**
                         * Creates a new UpdateCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseAction} UpdateCloudDatabaseAction instance
                         */
                        UpdateCloudDatabaseAction.create = function create(properties) {
                            return new UpdateCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified UpdateCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseAction} message UpdateCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.databaseName != null && Object.hasOwnProperty.call(message, "databaseName"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.databaseName);
                            if (message.enableDropProtection != null && Object.hasOwnProperty.call(message, "enableDropProtection"))
                                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.enableDropProtection);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified UpdateCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudDatabaseAction} message UpdateCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an UpdateCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseAction} UpdateCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.UpdateCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.databaseName = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.enableDropProtection = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an UpdateCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseAction} UpdateCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an UpdateCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        UpdateCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.databaseName != null && message.hasOwnProperty("databaseName"))
                                if (!$util.isString(message.databaseName))
                                    return "databaseName: string expected";
                            if (message.enableDropProtection != null && message.hasOwnProperty("enableDropProtection"))
                                if (typeof message.enableDropProtection !== "boolean")
                                    return "enableDropProtection: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates an UpdateCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.UpdateCloudDatabaseAction} UpdateCloudDatabaseAction
                         */
                        UpdateCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.UpdateCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.UpdateCloudDatabaseAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.databaseName != null)
                                message.databaseName = String(object.databaseName);
                            if (object.enableDropProtection != null)
                                message.enableDropProtection = Boolean(object.enableDropProtection);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an UpdateCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.UpdateCloudDatabaseAction} message UpdateCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        UpdateCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                                object.databaseName = "";
                                object.enableDropProtection = false;
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.databaseName != null && message.hasOwnProperty("databaseName"))
                                object.databaseName = message.databaseName;
                            if (message.enableDropProtection != null && message.hasOwnProperty("enableDropProtection"))
                                object.enableDropProtection = message.enableDropProtection;
                            return object;
                        };
    
                        /**
                         * Converts this UpdateCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        UpdateCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for UpdateCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.UpdateCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        UpdateCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.UpdateCloudDatabaseAction";
                        };
    
                        return UpdateCloudDatabaseAction;
                    })();
    
                    v1.DropCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of a DropCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IDropCloudDatabaseAction
                         * @property {string|null} [instanceId] DropCloudDatabaseAction instanceId
                         * @property {string|null} [projectId] DropCloudDatabaseAction projectId
                         * @property {string|null} [databaseId] DropCloudDatabaseAction databaseId
                         */
    
                        /**
                         * Constructs a new DropCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DropCloudDatabaseAction.
                         * @implements IDropCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IDropCloudDatabaseAction=} [properties] Properties to set
                         */
                        function DropCloudDatabaseAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DropCloudDatabaseAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @instance
                         */
                        DropCloudDatabaseAction.prototype.instanceId = "";
    
                        /**
                         * DropCloudDatabaseAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @instance
                         */
                        DropCloudDatabaseAction.prototype.projectId = "";
    
                        /**
                         * DropCloudDatabaseAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @instance
                         */
                        DropCloudDatabaseAction.prototype.databaseId = "";
    
                        /**
                         * Creates a new DropCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IDropCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DropCloudDatabaseAction} DropCloudDatabaseAction instance
                         */
                        DropCloudDatabaseAction.create = function create(properties) {
                            return new DropCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified DropCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.DropCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IDropCloudDatabaseAction} message DropCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DropCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.instanceId);
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.projectId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.databaseId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DropCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DropCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IDropCloudDatabaseAction} message DropCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DropCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DropCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DropCloudDatabaseAction} DropCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DropCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DropCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DropCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DropCloudDatabaseAction} DropCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DropCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DropCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DropCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a DropCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DropCloudDatabaseAction} DropCloudDatabaseAction
                         */
                        DropCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DropCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DropCloudDatabaseAction();
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DropCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.DropCloudDatabaseAction} message DropCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DropCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.instanceId = "";
                                object.projectId = "";
                                object.databaseId = "";
                            }
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            return object;
                        };
    
                        /**
                         * Converts this DropCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DropCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DropCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DropCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DropCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DropCloudDatabaseAction";
                        };
    
                        return DropCloudDatabaseAction;
                    })();
    
                    v1.ChangeQuorumCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of a ChangeQuorumCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IChangeQuorumCloudDatabaseAction
                         * @property {string|null} [databaseUri] ChangeQuorumCloudDatabaseAction databaseUri
                         * @property {Array.<string>|null} [servingLocations] ChangeQuorumCloudDatabaseAction servingLocations
                         */
    
                        /**
                         * Constructs a new ChangeQuorumCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ChangeQuorumCloudDatabaseAction.
                         * @implements IChangeQuorumCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction=} [properties] Properties to set
                         */
                        function ChangeQuorumCloudDatabaseAction(properties) {
                            this.servingLocations = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ChangeQuorumCloudDatabaseAction databaseUri.
                         * @member {string|null|undefined} databaseUri
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @instance
                         */
                        ChangeQuorumCloudDatabaseAction.prototype.databaseUri = null;
    
                        /**
                         * ChangeQuorumCloudDatabaseAction servingLocations.
                         * @member {Array.<string>} servingLocations
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @instance
                         */
                        ChangeQuorumCloudDatabaseAction.prototype.servingLocations = $util.emptyArray;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ChangeQuorumCloudDatabaseAction.prototype, "_databaseUri", {
                            get: $util.oneOfGetter($oneOfFields = ["databaseUri"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ChangeQuorumCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction} ChangeQuorumCloudDatabaseAction instance
                         */
                        ChangeQuorumCloudDatabaseAction.create = function create(properties) {
                            return new ChangeQuorumCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified ChangeQuorumCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction} message ChangeQuorumCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChangeQuorumCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.databaseUri != null && Object.hasOwnProperty.call(message, "databaseUri"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.databaseUri);
                            if (message.servingLocations != null && message.servingLocations.length)
                                for (var i = 0; i < message.servingLocations.length; ++i)
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.servingLocations[i]);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ChangeQuorumCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IChangeQuorumCloudDatabaseAction} message ChangeQuorumCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChangeQuorumCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ChangeQuorumCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction} ChangeQuorumCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChangeQuorumCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.databaseUri = reader.string();
                                        break;
                                    }
                                case 2: {
                                        if (!(message.servingLocations && message.servingLocations.length))
                                            message.servingLocations = [];
                                        message.servingLocations.push(reader.string());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ChangeQuorumCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction} ChangeQuorumCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChangeQuorumCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ChangeQuorumCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ChangeQuorumCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.databaseUri != null && message.hasOwnProperty("databaseUri")) {
                                properties._databaseUri = 1;
                                if (!$util.isString(message.databaseUri))
                                    return "databaseUri: string expected";
                            }
                            if (message.servingLocations != null && message.hasOwnProperty("servingLocations")) {
                                if (!Array.isArray(message.servingLocations))
                                    return "servingLocations: array expected";
                                for (var i = 0; i < message.servingLocations.length; ++i)
                                    if (!$util.isString(message.servingLocations[i]))
                                        return "servingLocations: string[] expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ChangeQuorumCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction} ChangeQuorumCloudDatabaseAction
                         */
                        ChangeQuorumCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction();
                            if (object.databaseUri != null)
                                message.databaseUri = String(object.databaseUri);
                            if (object.servingLocations) {
                                if (!Array.isArray(object.servingLocations))
                                    throw TypeError(".google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction.servingLocations: array expected");
                                message.servingLocations = [];
                                for (var i = 0; i < object.servingLocations.length; ++i)
                                    message.servingLocations[i] = String(object.servingLocations[i]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ChangeQuorumCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction} message ChangeQuorumCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ChangeQuorumCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.servingLocations = [];
                            if (message.databaseUri != null && message.hasOwnProperty("databaseUri")) {
                                object.databaseUri = message.databaseUri;
                                if (options.oneofs)
                                    object._databaseUri = "databaseUri";
                            }
                            if (message.servingLocations && message.servingLocations.length) {
                                object.servingLocations = [];
                                for (var j = 0; j < message.servingLocations.length; ++j)
                                    object.servingLocations[j] = message.servingLocations[j];
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ChangeQuorumCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ChangeQuorumCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ChangeQuorumCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ChangeQuorumCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ChangeQuorumCloudDatabaseAction";
                        };
    
                        return ChangeQuorumCloudDatabaseAction;
                    })();
    
                    v1.ListCloudDatabasesAction = (function() {
    
                        /**
                         * Properties of a ListCloudDatabasesAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudDatabasesAction
                         * @property {string|null} [projectId] ListCloudDatabasesAction projectId
                         * @property {string|null} [instanceId] ListCloudDatabasesAction instanceId
                         * @property {number|null} [pageSize] ListCloudDatabasesAction pageSize
                         * @property {string|null} [pageToken] ListCloudDatabasesAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudDatabasesAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudDatabasesAction.
                         * @implements IListCloudDatabasesAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudDatabasesAction=} [properties] Properties to set
                         */
                        function ListCloudDatabasesAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudDatabasesAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @instance
                         */
                        ListCloudDatabasesAction.prototype.projectId = "";
    
                        /**
                         * ListCloudDatabasesAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @instance
                         */
                        ListCloudDatabasesAction.prototype.instanceId = "";
    
                        /**
                         * ListCloudDatabasesAction pageSize.
                         * @member {number} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @instance
                         */
                        ListCloudDatabasesAction.prototype.pageSize = 0;
    
                        /**
                         * ListCloudDatabasesAction pageToken.
                         * @member {string} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @instance
                         */
                        ListCloudDatabasesAction.prototype.pageToken = "";
    
                        /**
                         * Creates a new ListCloudDatabasesAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabasesAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudDatabasesAction} ListCloudDatabasesAction instance
                         */
                        ListCloudDatabasesAction.create = function create(properties) {
                            return new ListCloudDatabasesAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudDatabasesAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudDatabasesAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabasesAction} message ListCloudDatabasesAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudDatabasesAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudDatabasesAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudDatabasesAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabasesAction} message ListCloudDatabasesAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudDatabasesAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudDatabasesAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudDatabasesAction} ListCloudDatabasesAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudDatabasesAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudDatabasesAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 4: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudDatabasesAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudDatabasesAction} ListCloudDatabasesAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudDatabasesAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudDatabasesAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudDatabasesAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudDatabasesAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudDatabasesAction} ListCloudDatabasesAction
                         */
                        ListCloudDatabasesAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudDatabasesAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudDatabasesAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudDatabasesAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudDatabasesAction} message ListCloudDatabasesAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudDatabasesAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.pageSize = 0;
                                object.pageToken = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                object.pageSize = message.pageSize;
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                object.pageToken = message.pageToken;
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudDatabasesAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudDatabasesAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudDatabasesAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudDatabasesAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudDatabasesAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudDatabasesAction";
                        };
    
                        return ListCloudDatabasesAction;
                    })();
    
                    v1.ListCloudInstancesAction = (function() {
    
                        /**
                         * Properties of a ListCloudInstancesAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudInstancesAction
                         * @property {string|null} [projectId] ListCloudInstancesAction projectId
                         * @property {string|null} [filter] ListCloudInstancesAction filter
                         * @property {number|null} [pageSize] ListCloudInstancesAction pageSize
                         * @property {string|null} [pageToken] ListCloudInstancesAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudInstancesAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudInstancesAction.
                         * @implements IListCloudInstancesAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudInstancesAction=} [properties] Properties to set
                         */
                        function ListCloudInstancesAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudInstancesAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @instance
                         */
                        ListCloudInstancesAction.prototype.projectId = "";
    
                        /**
                         * ListCloudInstancesAction filter.
                         * @member {string|null|undefined} filter
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @instance
                         */
                        ListCloudInstancesAction.prototype.filter = null;
    
                        /**
                         * ListCloudInstancesAction pageSize.
                         * @member {number|null|undefined} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @instance
                         */
                        ListCloudInstancesAction.prototype.pageSize = null;
    
                        /**
                         * ListCloudInstancesAction pageToken.
                         * @member {string|null|undefined} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @instance
                         */
                        ListCloudInstancesAction.prototype.pageToken = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ListCloudInstancesAction.prototype, "_filter", {
                            get: $util.oneOfGetter($oneOfFields = ["filter"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ListCloudInstancesAction.prototype, "_pageSize", {
                            get: $util.oneOfGetter($oneOfFields = ["pageSize"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ListCloudInstancesAction.prototype, "_pageToken", {
                            get: $util.oneOfGetter($oneOfFields = ["pageToken"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ListCloudInstancesAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstancesAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudInstancesAction} ListCloudInstancesAction instance
                         */
                        ListCloudInstancesAction.create = function create(properties) {
                            return new ListCloudInstancesAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudInstancesAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudInstancesAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstancesAction} message ListCloudInstancesAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudInstancesAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudInstancesAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudInstancesAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudInstancesAction} message ListCloudInstancesAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudInstancesAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudInstancesAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudInstancesAction} ListCloudInstancesAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudInstancesAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudInstancesAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.filter = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 4: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudInstancesAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudInstancesAction} ListCloudInstancesAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudInstancesAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudInstancesAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudInstancesAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.filter != null && message.hasOwnProperty("filter")) {
                                properties._filter = 1;
                                if (!$util.isString(message.filter))
                                    return "filter: string expected";
                            }
                            if (message.pageSize != null && message.hasOwnProperty("pageSize")) {
                                properties._pageSize = 1;
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            }
                            if (message.pageToken != null && message.hasOwnProperty("pageToken")) {
                                properties._pageToken = 1;
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudInstancesAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudInstancesAction} ListCloudInstancesAction
                         */
                        ListCloudInstancesAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudInstancesAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudInstancesAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.filter != null)
                                message.filter = String(object.filter);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudInstancesAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudInstancesAction} message ListCloudInstancesAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudInstancesAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.projectId = "";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.filter != null && message.hasOwnProperty("filter")) {
                                object.filter = message.filter;
                                if (options.oneofs)
                                    object._filter = "filter";
                            }
                            if (message.pageSize != null && message.hasOwnProperty("pageSize")) {
                                object.pageSize = message.pageSize;
                                if (options.oneofs)
                                    object._pageSize = "pageSize";
                            }
                            if (message.pageToken != null && message.hasOwnProperty("pageToken")) {
                                object.pageToken = message.pageToken;
                                if (options.oneofs)
                                    object._pageToken = "pageToken";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudInstancesAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudInstancesAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudInstancesAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudInstancesAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudInstancesAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudInstancesAction";
                        };
    
                        return ListCloudInstancesAction;
                    })();
    
                    v1.GetCloudInstanceAction = (function() {
    
                        /**
                         * Properties of a GetCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGetCloudInstanceAction
                         * @property {string|null} [projectId] GetCloudInstanceAction projectId
                         * @property {string|null} [instanceId] GetCloudInstanceAction instanceId
                         */
    
                        /**
                         * Constructs a new GetCloudInstanceAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GetCloudInstanceAction.
                         * @implements IGetCloudInstanceAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGetCloudInstanceAction=} [properties] Properties to set
                         */
                        function GetCloudInstanceAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GetCloudInstanceAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @instance
                         */
                        GetCloudInstanceAction.prototype.projectId = "";
    
                        /**
                         * GetCloudInstanceAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @instance
                         */
                        GetCloudInstanceAction.prototype.instanceId = "";
    
                        /**
                         * Creates a new GetCloudInstanceAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GetCloudInstanceAction} GetCloudInstanceAction instance
                         */
                        GetCloudInstanceAction.create = function create(properties) {
                            return new GetCloudInstanceAction(properties);
                        };
    
                        /**
                         * Encodes the specified GetCloudInstanceAction message. Does not implicitly {@link google.spanner.executor.v1.GetCloudInstanceAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceAction} message GetCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudInstanceAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GetCloudInstanceAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GetCloudInstanceAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudInstanceAction} message GetCloudInstanceAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudInstanceAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GetCloudInstanceAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GetCloudInstanceAction} GetCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudInstanceAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GetCloudInstanceAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GetCloudInstanceAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GetCloudInstanceAction} GetCloudInstanceAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudInstanceAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GetCloudInstanceAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GetCloudInstanceAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a GetCloudInstanceAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GetCloudInstanceAction} GetCloudInstanceAction
                         */
                        GetCloudInstanceAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GetCloudInstanceAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GetCloudInstanceAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GetCloudInstanceAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {google.spanner.executor.v1.GetCloudInstanceAction} message GetCloudInstanceAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GetCloudInstanceAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            return object;
                        };
    
                        /**
                         * Converts this GetCloudInstanceAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GetCloudInstanceAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GetCloudInstanceAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GetCloudInstanceAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GetCloudInstanceAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GetCloudInstanceAction";
                        };
    
                        return GetCloudInstanceAction;
                    })();
    
                    v1.ListCloudDatabaseOperationsAction = (function() {
    
                        /**
                         * Properties of a ListCloudDatabaseOperationsAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudDatabaseOperationsAction
                         * @property {string|null} [projectId] ListCloudDatabaseOperationsAction projectId
                         * @property {string|null} [instanceId] ListCloudDatabaseOperationsAction instanceId
                         * @property {string|null} [filter] ListCloudDatabaseOperationsAction filter
                         * @property {number|null} [pageSize] ListCloudDatabaseOperationsAction pageSize
                         * @property {string|null} [pageToken] ListCloudDatabaseOperationsAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudDatabaseOperationsAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudDatabaseOperationsAction.
                         * @implements IListCloudDatabaseOperationsAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudDatabaseOperationsAction=} [properties] Properties to set
                         */
                        function ListCloudDatabaseOperationsAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudDatabaseOperationsAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         */
                        ListCloudDatabaseOperationsAction.prototype.projectId = "";
    
                        /**
                         * ListCloudDatabaseOperationsAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         */
                        ListCloudDatabaseOperationsAction.prototype.instanceId = "";
    
                        /**
                         * ListCloudDatabaseOperationsAction filter.
                         * @member {string} filter
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         */
                        ListCloudDatabaseOperationsAction.prototype.filter = "";
    
                        /**
                         * ListCloudDatabaseOperationsAction pageSize.
                         * @member {number} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         */
                        ListCloudDatabaseOperationsAction.prototype.pageSize = 0;
    
                        /**
                         * ListCloudDatabaseOperationsAction pageToken.
                         * @member {string} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         */
                        ListCloudDatabaseOperationsAction.prototype.pageToken = "";
    
                        /**
                         * Creates a new ListCloudDatabaseOperationsAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabaseOperationsAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudDatabaseOperationsAction} ListCloudDatabaseOperationsAction instance
                         */
                        ListCloudDatabaseOperationsAction.create = function create(properties) {
                            return new ListCloudDatabaseOperationsAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudDatabaseOperationsAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudDatabaseOperationsAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabaseOperationsAction} message ListCloudDatabaseOperationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudDatabaseOperationsAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudDatabaseOperationsAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudDatabaseOperationsAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudDatabaseOperationsAction} message ListCloudDatabaseOperationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudDatabaseOperationsAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudDatabaseOperationsAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudDatabaseOperationsAction} ListCloudDatabaseOperationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudDatabaseOperationsAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.filter = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 5: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudDatabaseOperationsAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudDatabaseOperationsAction} ListCloudDatabaseOperationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudDatabaseOperationsAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudDatabaseOperationsAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudDatabaseOperationsAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                if (!$util.isString(message.filter))
                                    return "filter: string expected";
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudDatabaseOperationsAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudDatabaseOperationsAction} ListCloudDatabaseOperationsAction
                         */
                        ListCloudDatabaseOperationsAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudDatabaseOperationsAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.filter != null)
                                message.filter = String(object.filter);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudDatabaseOperationsAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudDatabaseOperationsAction} message ListCloudDatabaseOperationsAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudDatabaseOperationsAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.filter = "";
                                object.pageSize = 0;
                                object.pageToken = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                object.filter = message.filter;
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                object.pageSize = message.pageSize;
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                object.pageToken = message.pageToken;
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudDatabaseOperationsAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudDatabaseOperationsAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudDatabaseOperationsAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudDatabaseOperationsAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudDatabaseOperationsAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudDatabaseOperationsAction";
                        };
    
                        return ListCloudDatabaseOperationsAction;
                    })();
    
                    v1.RestoreCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of a RestoreCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IRestoreCloudDatabaseAction
                         * @property {string|null} [projectId] RestoreCloudDatabaseAction projectId
                         * @property {string|null} [backupInstanceId] RestoreCloudDatabaseAction backupInstanceId
                         * @property {string|null} [backupId] RestoreCloudDatabaseAction backupId
                         * @property {string|null} [databaseInstanceId] RestoreCloudDatabaseAction databaseInstanceId
                         * @property {string|null} [databaseId] RestoreCloudDatabaseAction databaseId
                         * @property {google.spanner.admin.database.v1.IEncryptionConfig|null} [encryptionConfig] RestoreCloudDatabaseAction encryptionConfig
                         */
    
                        /**
                         * Constructs a new RestoreCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a RestoreCloudDatabaseAction.
                         * @implements IRestoreCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IRestoreCloudDatabaseAction=} [properties] Properties to set
                         */
                        function RestoreCloudDatabaseAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * RestoreCloudDatabaseAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.projectId = "";
    
                        /**
                         * RestoreCloudDatabaseAction backupInstanceId.
                         * @member {string} backupInstanceId
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.backupInstanceId = "";
    
                        /**
                         * RestoreCloudDatabaseAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.backupId = "";
    
                        /**
                         * RestoreCloudDatabaseAction databaseInstanceId.
                         * @member {string} databaseInstanceId
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.databaseInstanceId = "";
    
                        /**
                         * RestoreCloudDatabaseAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.databaseId = "";
    
                        /**
                         * RestoreCloudDatabaseAction encryptionConfig.
                         * @member {google.spanner.admin.database.v1.IEncryptionConfig|null|undefined} encryptionConfig
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         */
                        RestoreCloudDatabaseAction.prototype.encryptionConfig = null;
    
                        /**
                         * Creates a new RestoreCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IRestoreCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.RestoreCloudDatabaseAction} RestoreCloudDatabaseAction instance
                         */
                        RestoreCloudDatabaseAction.create = function create(properties) {
                            return new RestoreCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified RestoreCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.RestoreCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IRestoreCloudDatabaseAction} message RestoreCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        RestoreCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.backupInstanceId != null && Object.hasOwnProperty.call(message, "backupInstanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.backupInstanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            if (message.databaseInstanceId != null && Object.hasOwnProperty.call(message, "databaseInstanceId"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.databaseInstanceId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.databaseId);
                            if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                $root.google.spanner.admin.database.v1.EncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified RestoreCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.RestoreCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IRestoreCloudDatabaseAction} message RestoreCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        RestoreCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a RestoreCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.RestoreCloudDatabaseAction} RestoreCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        RestoreCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.RestoreCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.backupInstanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.databaseInstanceId = reader.string();
                                        break;
                                    }
                                case 5: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                case 7: {
                                        message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a RestoreCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.RestoreCloudDatabaseAction} RestoreCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        RestoreCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a RestoreCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        RestoreCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.backupInstanceId != null && message.hasOwnProperty("backupInstanceId"))
                                if (!$util.isString(message.backupInstanceId))
                                    return "backupInstanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            if (message.databaseInstanceId != null && message.hasOwnProperty("databaseInstanceId"))
                                if (!$util.isString(message.databaseInstanceId))
                                    return "databaseInstanceId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                var error = $root.google.spanner.admin.database.v1.EncryptionConfig.verify(message.encryptionConfig);
                                if (error)
                                    return "encryptionConfig." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a RestoreCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.RestoreCloudDatabaseAction} RestoreCloudDatabaseAction
                         */
                        RestoreCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.RestoreCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.RestoreCloudDatabaseAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.backupInstanceId != null)
                                message.backupInstanceId = String(object.backupInstanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            if (object.databaseInstanceId != null)
                                message.databaseInstanceId = String(object.databaseInstanceId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            if (object.encryptionConfig != null) {
                                if (typeof object.encryptionConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.RestoreCloudDatabaseAction.encryptionConfig: object expected");
                                message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.fromObject(object.encryptionConfig);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a RestoreCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.RestoreCloudDatabaseAction} message RestoreCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        RestoreCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.backupInstanceId = "";
                                object.backupId = "";
                                object.databaseInstanceId = "";
                                object.databaseId = "";
                                object.encryptionConfig = null;
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.backupInstanceId != null && message.hasOwnProperty("backupInstanceId"))
                                object.backupInstanceId = message.backupInstanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            if (message.databaseInstanceId != null && message.hasOwnProperty("databaseInstanceId"))
                                object.databaseInstanceId = message.databaseInstanceId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                object.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.toObject(message.encryptionConfig, options);
                            return object;
                        };
    
                        /**
                         * Converts this RestoreCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        RestoreCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for RestoreCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.RestoreCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        RestoreCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.RestoreCloudDatabaseAction";
                        };
    
                        return RestoreCloudDatabaseAction;
                    })();
    
                    v1.GetCloudDatabaseAction = (function() {
    
                        /**
                         * Properties of a GetCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGetCloudDatabaseAction
                         * @property {string|null} [projectId] GetCloudDatabaseAction projectId
                         * @property {string|null} [instanceId] GetCloudDatabaseAction instanceId
                         * @property {string|null} [databaseId] GetCloudDatabaseAction databaseId
                         */
    
                        /**
                         * Constructs a new GetCloudDatabaseAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GetCloudDatabaseAction.
                         * @implements IGetCloudDatabaseAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGetCloudDatabaseAction=} [properties] Properties to set
                         */
                        function GetCloudDatabaseAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GetCloudDatabaseAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @instance
                         */
                        GetCloudDatabaseAction.prototype.projectId = "";
    
                        /**
                         * GetCloudDatabaseAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @instance
                         */
                        GetCloudDatabaseAction.prototype.instanceId = "";
    
                        /**
                         * GetCloudDatabaseAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @instance
                         */
                        GetCloudDatabaseAction.prototype.databaseId = "";
    
                        /**
                         * Creates a new GetCloudDatabaseAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudDatabaseAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GetCloudDatabaseAction} GetCloudDatabaseAction instance
                         */
                        GetCloudDatabaseAction.create = function create(properties) {
                            return new GetCloudDatabaseAction(properties);
                        };
    
                        /**
                         * Encodes the specified GetCloudDatabaseAction message. Does not implicitly {@link google.spanner.executor.v1.GetCloudDatabaseAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudDatabaseAction} message GetCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudDatabaseAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.databaseId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GetCloudDatabaseAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GetCloudDatabaseAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudDatabaseAction} message GetCloudDatabaseAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudDatabaseAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GetCloudDatabaseAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GetCloudDatabaseAction} GetCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudDatabaseAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GetCloudDatabaseAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GetCloudDatabaseAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GetCloudDatabaseAction} GetCloudDatabaseAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudDatabaseAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GetCloudDatabaseAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GetCloudDatabaseAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a GetCloudDatabaseAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GetCloudDatabaseAction} GetCloudDatabaseAction
                         */
                        GetCloudDatabaseAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GetCloudDatabaseAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GetCloudDatabaseAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GetCloudDatabaseAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {google.spanner.executor.v1.GetCloudDatabaseAction} message GetCloudDatabaseAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GetCloudDatabaseAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.databaseId = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            return object;
                        };
    
                        /**
                         * Converts this GetCloudDatabaseAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GetCloudDatabaseAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GetCloudDatabaseAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GetCloudDatabaseAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GetCloudDatabaseAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GetCloudDatabaseAction";
                        };
    
                        return GetCloudDatabaseAction;
                    })();
    
                    v1.CreateCloudBackupAction = (function() {
    
                        /**
                         * Properties of a CreateCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICreateCloudBackupAction
                         * @property {string|null} [projectId] CreateCloudBackupAction projectId
                         * @property {string|null} [instanceId] CreateCloudBackupAction instanceId
                         * @property {string|null} [backupId] CreateCloudBackupAction backupId
                         * @property {string|null} [databaseId] CreateCloudBackupAction databaseId
                         * @property {google.protobuf.ITimestamp|null} [expireTime] CreateCloudBackupAction expireTime
                         * @property {google.protobuf.ITimestamp|null} [versionTime] CreateCloudBackupAction versionTime
                         * @property {google.spanner.admin.database.v1.IEncryptionConfig|null} [encryptionConfig] CreateCloudBackupAction encryptionConfig
                         */
    
                        /**
                         * Constructs a new CreateCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CreateCloudBackupAction.
                         * @implements ICreateCloudBackupAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICreateCloudBackupAction=} [properties] Properties to set
                         */
                        function CreateCloudBackupAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CreateCloudBackupAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.projectId = "";
    
                        /**
                         * CreateCloudBackupAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.instanceId = "";
    
                        /**
                         * CreateCloudBackupAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.backupId = "";
    
                        /**
                         * CreateCloudBackupAction databaseId.
                         * @member {string} databaseId
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.databaseId = "";
    
                        /**
                         * CreateCloudBackupAction expireTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.expireTime = null;
    
                        /**
                         * CreateCloudBackupAction versionTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} versionTime
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.versionTime = null;
    
                        /**
                         * CreateCloudBackupAction encryptionConfig.
                         * @member {google.spanner.admin.database.v1.IEncryptionConfig|null|undefined} encryptionConfig
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         */
                        CreateCloudBackupAction.prototype.encryptionConfig = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(CreateCloudBackupAction.prototype, "_versionTime", {
                            get: $util.oneOfGetter($oneOfFields = ["versionTime"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new CreateCloudBackupAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudBackupAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CreateCloudBackupAction} CreateCloudBackupAction instance
                         */
                        CreateCloudBackupAction.create = function create(properties) {
                            return new CreateCloudBackupAction(properties);
                        };
    
                        /**
                         * Encodes the specified CreateCloudBackupAction message. Does not implicitly {@link google.spanner.executor.v1.CreateCloudBackupAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudBackupAction} message CreateCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudBackupAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            if (message.databaseId != null && Object.hasOwnProperty.call(message, "databaseId"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.databaseId);
                            if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            if (message.versionTime != null && Object.hasOwnProperty.call(message, "versionTime"))
                                $root.google.protobuf.Timestamp.encode(message.versionTime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                            if (message.encryptionConfig != null && Object.hasOwnProperty.call(message, "encryptionConfig"))
                                $root.google.spanner.admin.database.v1.EncryptionConfig.encode(message.encryptionConfig, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CreateCloudBackupAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CreateCloudBackupAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICreateCloudBackupAction} message CreateCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CreateCloudBackupAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CreateCloudBackupAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CreateCloudBackupAction} CreateCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudBackupAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CreateCloudBackupAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.databaseId = reader.string();
                                        break;
                                    }
                                case 5: {
                                        message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 6: {
                                        message.versionTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 7: {
                                        message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CreateCloudBackupAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CreateCloudBackupAction} CreateCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CreateCloudBackupAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CreateCloudBackupAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CreateCloudBackupAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                if (!$util.isString(message.databaseId))
                                    return "databaseId: string expected";
                            if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                if (error)
                                    return "expireTime." + error;
                            }
                            if (message.versionTime != null && message.hasOwnProperty("versionTime")) {
                                properties._versionTime = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.versionTime);
                                    if (error)
                                        return "versionTime." + error;
                                }
                            }
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig")) {
                                var error = $root.google.spanner.admin.database.v1.EncryptionConfig.verify(message.encryptionConfig);
                                if (error)
                                    return "encryptionConfig." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CreateCloudBackupAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CreateCloudBackupAction} CreateCloudBackupAction
                         */
                        CreateCloudBackupAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CreateCloudBackupAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CreateCloudBackupAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            if (object.databaseId != null)
                                message.databaseId = String(object.databaseId);
                            if (object.expireTime != null) {
                                if (typeof object.expireTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudBackupAction.expireTime: object expected");
                                message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                            }
                            if (object.versionTime != null) {
                                if (typeof object.versionTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudBackupAction.versionTime: object expected");
                                message.versionTime = $root.google.protobuf.Timestamp.fromObject(object.versionTime);
                            }
                            if (object.encryptionConfig != null) {
                                if (typeof object.encryptionConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CreateCloudBackupAction.encryptionConfig: object expected");
                                message.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.fromObject(object.encryptionConfig);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CreateCloudBackupAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.CreateCloudBackupAction} message CreateCloudBackupAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CreateCloudBackupAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.backupId = "";
                                object.databaseId = "";
                                object.expireTime = null;
                                object.encryptionConfig = null;
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            if (message.databaseId != null && message.hasOwnProperty("databaseId"))
                                object.databaseId = message.databaseId;
                            if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                            if (message.versionTime != null && message.hasOwnProperty("versionTime")) {
                                object.versionTime = $root.google.protobuf.Timestamp.toObject(message.versionTime, options);
                                if (options.oneofs)
                                    object._versionTime = "versionTime";
                            }
                            if (message.encryptionConfig != null && message.hasOwnProperty("encryptionConfig"))
                                object.encryptionConfig = $root.google.spanner.admin.database.v1.EncryptionConfig.toObject(message.encryptionConfig, options);
                            return object;
                        };
    
                        /**
                         * Converts this CreateCloudBackupAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CreateCloudBackupAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CreateCloudBackupAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CreateCloudBackupAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CreateCloudBackupAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CreateCloudBackupAction";
                        };
    
                        return CreateCloudBackupAction;
                    })();
    
                    v1.CopyCloudBackupAction = (function() {
    
                        /**
                         * Properties of a CopyCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICopyCloudBackupAction
                         * @property {string|null} [projectId] CopyCloudBackupAction projectId
                         * @property {string|null} [instanceId] CopyCloudBackupAction instanceId
                         * @property {string|null} [backupId] CopyCloudBackupAction backupId
                         * @property {string|null} [sourceBackup] CopyCloudBackupAction sourceBackup
                         * @property {google.protobuf.ITimestamp|null} [expireTime] CopyCloudBackupAction expireTime
                         */
    
                        /**
                         * Constructs a new CopyCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CopyCloudBackupAction.
                         * @implements ICopyCloudBackupAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICopyCloudBackupAction=} [properties] Properties to set
                         */
                        function CopyCloudBackupAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CopyCloudBackupAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         */
                        CopyCloudBackupAction.prototype.projectId = "";
    
                        /**
                         * CopyCloudBackupAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         */
                        CopyCloudBackupAction.prototype.instanceId = "";
    
                        /**
                         * CopyCloudBackupAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         */
                        CopyCloudBackupAction.prototype.backupId = "";
    
                        /**
                         * CopyCloudBackupAction sourceBackup.
                         * @member {string} sourceBackup
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         */
                        CopyCloudBackupAction.prototype.sourceBackup = "";
    
                        /**
                         * CopyCloudBackupAction expireTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         */
                        CopyCloudBackupAction.prototype.expireTime = null;
    
                        /**
                         * Creates a new CopyCloudBackupAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICopyCloudBackupAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CopyCloudBackupAction} CopyCloudBackupAction instance
                         */
                        CopyCloudBackupAction.create = function create(properties) {
                            return new CopyCloudBackupAction(properties);
                        };
    
                        /**
                         * Encodes the specified CopyCloudBackupAction message. Does not implicitly {@link google.spanner.executor.v1.CopyCloudBackupAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICopyCloudBackupAction} message CopyCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CopyCloudBackupAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            if (message.sourceBackup != null && Object.hasOwnProperty.call(message, "sourceBackup"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.sourceBackup);
                            if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CopyCloudBackupAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CopyCloudBackupAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.ICopyCloudBackupAction} message CopyCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CopyCloudBackupAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CopyCloudBackupAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CopyCloudBackupAction} CopyCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CopyCloudBackupAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CopyCloudBackupAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.sourceBackup = reader.string();
                                        break;
                                    }
                                case 5: {
                                        message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CopyCloudBackupAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CopyCloudBackupAction} CopyCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CopyCloudBackupAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CopyCloudBackupAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CopyCloudBackupAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                if (!$util.isString(message.sourceBackup))
                                    return "sourceBackup: string expected";
                            if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                if (error)
                                    return "expireTime." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CopyCloudBackupAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CopyCloudBackupAction} CopyCloudBackupAction
                         */
                        CopyCloudBackupAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CopyCloudBackupAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CopyCloudBackupAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            if (object.sourceBackup != null)
                                message.sourceBackup = String(object.sourceBackup);
                            if (object.expireTime != null) {
                                if (typeof object.expireTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CopyCloudBackupAction.expireTime: object expected");
                                message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CopyCloudBackupAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.CopyCloudBackupAction} message CopyCloudBackupAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CopyCloudBackupAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.backupId = "";
                                object.sourceBackup = "";
                                object.expireTime = null;
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            if (message.sourceBackup != null && message.hasOwnProperty("sourceBackup"))
                                object.sourceBackup = message.sourceBackup;
                            if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                            return object;
                        };
    
                        /**
                         * Converts this CopyCloudBackupAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CopyCloudBackupAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CopyCloudBackupAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CopyCloudBackupAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CopyCloudBackupAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CopyCloudBackupAction";
                        };
    
                        return CopyCloudBackupAction;
                    })();
    
                    v1.GetCloudBackupAction = (function() {
    
                        /**
                         * Properties of a GetCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGetCloudBackupAction
                         * @property {string|null} [projectId] GetCloudBackupAction projectId
                         * @property {string|null} [instanceId] GetCloudBackupAction instanceId
                         * @property {string|null} [backupId] GetCloudBackupAction backupId
                         */
    
                        /**
                         * Constructs a new GetCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GetCloudBackupAction.
                         * @implements IGetCloudBackupAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGetCloudBackupAction=} [properties] Properties to set
                         */
                        function GetCloudBackupAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GetCloudBackupAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @instance
                         */
                        GetCloudBackupAction.prototype.projectId = "";
    
                        /**
                         * GetCloudBackupAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @instance
                         */
                        GetCloudBackupAction.prototype.instanceId = "";
    
                        /**
                         * GetCloudBackupAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @instance
                         */
                        GetCloudBackupAction.prototype.backupId = "";
    
                        /**
                         * Creates a new GetCloudBackupAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudBackupAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GetCloudBackupAction} GetCloudBackupAction instance
                         */
                        GetCloudBackupAction.create = function create(properties) {
                            return new GetCloudBackupAction(properties);
                        };
    
                        /**
                         * Encodes the specified GetCloudBackupAction message. Does not implicitly {@link google.spanner.executor.v1.GetCloudBackupAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudBackupAction} message GetCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudBackupAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GetCloudBackupAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GetCloudBackupAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetCloudBackupAction} message GetCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetCloudBackupAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GetCloudBackupAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GetCloudBackupAction} GetCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudBackupAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GetCloudBackupAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GetCloudBackupAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GetCloudBackupAction} GetCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetCloudBackupAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GetCloudBackupAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GetCloudBackupAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a GetCloudBackupAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GetCloudBackupAction} GetCloudBackupAction
                         */
                        GetCloudBackupAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GetCloudBackupAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GetCloudBackupAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GetCloudBackupAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.GetCloudBackupAction} message GetCloudBackupAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GetCloudBackupAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.backupId = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            return object;
                        };
    
                        /**
                         * Converts this GetCloudBackupAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GetCloudBackupAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GetCloudBackupAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GetCloudBackupAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GetCloudBackupAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GetCloudBackupAction";
                        };
    
                        return GetCloudBackupAction;
                    })();
    
                    v1.UpdateCloudBackupAction = (function() {
    
                        /**
                         * Properties of an UpdateCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IUpdateCloudBackupAction
                         * @property {string|null} [projectId] UpdateCloudBackupAction projectId
                         * @property {string|null} [instanceId] UpdateCloudBackupAction instanceId
                         * @property {string|null} [backupId] UpdateCloudBackupAction backupId
                         * @property {google.protobuf.ITimestamp|null} [expireTime] UpdateCloudBackupAction expireTime
                         */
    
                        /**
                         * Constructs a new UpdateCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an UpdateCloudBackupAction.
                         * @implements IUpdateCloudBackupAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IUpdateCloudBackupAction=} [properties] Properties to set
                         */
                        function UpdateCloudBackupAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * UpdateCloudBackupAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @instance
                         */
                        UpdateCloudBackupAction.prototype.projectId = "";
    
                        /**
                         * UpdateCloudBackupAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @instance
                         */
                        UpdateCloudBackupAction.prototype.instanceId = "";
    
                        /**
                         * UpdateCloudBackupAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @instance
                         */
                        UpdateCloudBackupAction.prototype.backupId = "";
    
                        /**
                         * UpdateCloudBackupAction expireTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} expireTime
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @instance
                         */
                        UpdateCloudBackupAction.prototype.expireTime = null;
    
                        /**
                         * Creates a new UpdateCloudBackupAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudBackupAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.UpdateCloudBackupAction} UpdateCloudBackupAction instance
                         */
                        UpdateCloudBackupAction.create = function create(properties) {
                            return new UpdateCloudBackupAction(properties);
                        };
    
                        /**
                         * Encodes the specified UpdateCloudBackupAction message. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudBackupAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudBackupAction} message UpdateCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudBackupAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            if (message.expireTime != null && Object.hasOwnProperty.call(message, "expireTime"))
                                $root.google.protobuf.Timestamp.encode(message.expireTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified UpdateCloudBackupAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.UpdateCloudBackupAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IUpdateCloudBackupAction} message UpdateCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        UpdateCloudBackupAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an UpdateCloudBackupAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.UpdateCloudBackupAction} UpdateCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudBackupAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.UpdateCloudBackupAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.expireTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an UpdateCloudBackupAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.UpdateCloudBackupAction} UpdateCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        UpdateCloudBackupAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an UpdateCloudBackupAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        UpdateCloudBackupAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            if (message.expireTime != null && message.hasOwnProperty("expireTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.expireTime);
                                if (error)
                                    return "expireTime." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates an UpdateCloudBackupAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.UpdateCloudBackupAction} UpdateCloudBackupAction
                         */
                        UpdateCloudBackupAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.UpdateCloudBackupAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.UpdateCloudBackupAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            if (object.expireTime != null) {
                                if (typeof object.expireTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.UpdateCloudBackupAction.expireTime: object expected");
                                message.expireTime = $root.google.protobuf.Timestamp.fromObject(object.expireTime);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an UpdateCloudBackupAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.UpdateCloudBackupAction} message UpdateCloudBackupAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        UpdateCloudBackupAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.backupId = "";
                                object.expireTime = null;
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            if (message.expireTime != null && message.hasOwnProperty("expireTime"))
                                object.expireTime = $root.google.protobuf.Timestamp.toObject(message.expireTime, options);
                            return object;
                        };
    
                        /**
                         * Converts this UpdateCloudBackupAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        UpdateCloudBackupAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for UpdateCloudBackupAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.UpdateCloudBackupAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        UpdateCloudBackupAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.UpdateCloudBackupAction";
                        };
    
                        return UpdateCloudBackupAction;
                    })();
    
                    v1.DeleteCloudBackupAction = (function() {
    
                        /**
                         * Properties of a DeleteCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IDeleteCloudBackupAction
                         * @property {string|null} [projectId] DeleteCloudBackupAction projectId
                         * @property {string|null} [instanceId] DeleteCloudBackupAction instanceId
                         * @property {string|null} [backupId] DeleteCloudBackupAction backupId
                         */
    
                        /**
                         * Constructs a new DeleteCloudBackupAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DeleteCloudBackupAction.
                         * @implements IDeleteCloudBackupAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IDeleteCloudBackupAction=} [properties] Properties to set
                         */
                        function DeleteCloudBackupAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DeleteCloudBackupAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @instance
                         */
                        DeleteCloudBackupAction.prototype.projectId = "";
    
                        /**
                         * DeleteCloudBackupAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @instance
                         */
                        DeleteCloudBackupAction.prototype.instanceId = "";
    
                        /**
                         * DeleteCloudBackupAction backupId.
                         * @member {string} backupId
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @instance
                         */
                        DeleteCloudBackupAction.prototype.backupId = "";
    
                        /**
                         * Creates a new DeleteCloudBackupAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudBackupAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DeleteCloudBackupAction} DeleteCloudBackupAction instance
                         */
                        DeleteCloudBackupAction.create = function create(properties) {
                            return new DeleteCloudBackupAction(properties);
                        };
    
                        /**
                         * Encodes the specified DeleteCloudBackupAction message. Does not implicitly {@link google.spanner.executor.v1.DeleteCloudBackupAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudBackupAction} message DeleteCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteCloudBackupAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.backupId != null && Object.hasOwnProperty.call(message, "backupId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.backupId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DeleteCloudBackupAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DeleteCloudBackupAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.IDeleteCloudBackupAction} message DeleteCloudBackupAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DeleteCloudBackupAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DeleteCloudBackupAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DeleteCloudBackupAction} DeleteCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteCloudBackupAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DeleteCloudBackupAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.backupId = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DeleteCloudBackupAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DeleteCloudBackupAction} DeleteCloudBackupAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DeleteCloudBackupAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DeleteCloudBackupAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DeleteCloudBackupAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                if (!$util.isString(message.backupId))
                                    return "backupId: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a DeleteCloudBackupAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DeleteCloudBackupAction} DeleteCloudBackupAction
                         */
                        DeleteCloudBackupAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DeleteCloudBackupAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DeleteCloudBackupAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.backupId != null)
                                message.backupId = String(object.backupId);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DeleteCloudBackupAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {google.spanner.executor.v1.DeleteCloudBackupAction} message DeleteCloudBackupAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DeleteCloudBackupAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.backupId = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.backupId != null && message.hasOwnProperty("backupId"))
                                object.backupId = message.backupId;
                            return object;
                        };
    
                        /**
                         * Converts this DeleteCloudBackupAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DeleteCloudBackupAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DeleteCloudBackupAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DeleteCloudBackupAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DeleteCloudBackupAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DeleteCloudBackupAction";
                        };
    
                        return DeleteCloudBackupAction;
                    })();
    
                    v1.ListCloudBackupsAction = (function() {
    
                        /**
                         * Properties of a ListCloudBackupsAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudBackupsAction
                         * @property {string|null} [projectId] ListCloudBackupsAction projectId
                         * @property {string|null} [instanceId] ListCloudBackupsAction instanceId
                         * @property {string|null} [filter] ListCloudBackupsAction filter
                         * @property {number|null} [pageSize] ListCloudBackupsAction pageSize
                         * @property {string|null} [pageToken] ListCloudBackupsAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudBackupsAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudBackupsAction.
                         * @implements IListCloudBackupsAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudBackupsAction=} [properties] Properties to set
                         */
                        function ListCloudBackupsAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudBackupsAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         */
                        ListCloudBackupsAction.prototype.projectId = "";
    
                        /**
                         * ListCloudBackupsAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         */
                        ListCloudBackupsAction.prototype.instanceId = "";
    
                        /**
                         * ListCloudBackupsAction filter.
                         * @member {string} filter
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         */
                        ListCloudBackupsAction.prototype.filter = "";
    
                        /**
                         * ListCloudBackupsAction pageSize.
                         * @member {number} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         */
                        ListCloudBackupsAction.prototype.pageSize = 0;
    
                        /**
                         * ListCloudBackupsAction pageToken.
                         * @member {string} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         */
                        ListCloudBackupsAction.prototype.pageToken = "";
    
                        /**
                         * Creates a new ListCloudBackupsAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupsAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudBackupsAction} ListCloudBackupsAction instance
                         */
                        ListCloudBackupsAction.create = function create(properties) {
                            return new ListCloudBackupsAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudBackupsAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudBackupsAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupsAction} message ListCloudBackupsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudBackupsAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudBackupsAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudBackupsAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupsAction} message ListCloudBackupsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudBackupsAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudBackupsAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudBackupsAction} ListCloudBackupsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudBackupsAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudBackupsAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.filter = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 5: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudBackupsAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudBackupsAction} ListCloudBackupsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudBackupsAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudBackupsAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudBackupsAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                if (!$util.isString(message.filter))
                                    return "filter: string expected";
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudBackupsAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudBackupsAction} ListCloudBackupsAction
                         */
                        ListCloudBackupsAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudBackupsAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudBackupsAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.filter != null)
                                message.filter = String(object.filter);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudBackupsAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudBackupsAction} message ListCloudBackupsAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudBackupsAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.filter = "";
                                object.pageSize = 0;
                                object.pageToken = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                object.filter = message.filter;
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                object.pageSize = message.pageSize;
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                object.pageToken = message.pageToken;
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudBackupsAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudBackupsAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudBackupsAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudBackupsAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudBackupsAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudBackupsAction";
                        };
    
                        return ListCloudBackupsAction;
                    })();
    
                    v1.ListCloudBackupOperationsAction = (function() {
    
                        /**
                         * Properties of a ListCloudBackupOperationsAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IListCloudBackupOperationsAction
                         * @property {string|null} [projectId] ListCloudBackupOperationsAction projectId
                         * @property {string|null} [instanceId] ListCloudBackupOperationsAction instanceId
                         * @property {string|null} [filter] ListCloudBackupOperationsAction filter
                         * @property {number|null} [pageSize] ListCloudBackupOperationsAction pageSize
                         * @property {string|null} [pageToken] ListCloudBackupOperationsAction pageToken
                         */
    
                        /**
                         * Constructs a new ListCloudBackupOperationsAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ListCloudBackupOperationsAction.
                         * @implements IListCloudBackupOperationsAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IListCloudBackupOperationsAction=} [properties] Properties to set
                         */
                        function ListCloudBackupOperationsAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ListCloudBackupOperationsAction projectId.
                         * @member {string} projectId
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         */
                        ListCloudBackupOperationsAction.prototype.projectId = "";
    
                        /**
                         * ListCloudBackupOperationsAction instanceId.
                         * @member {string} instanceId
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         */
                        ListCloudBackupOperationsAction.prototype.instanceId = "";
    
                        /**
                         * ListCloudBackupOperationsAction filter.
                         * @member {string} filter
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         */
                        ListCloudBackupOperationsAction.prototype.filter = "";
    
                        /**
                         * ListCloudBackupOperationsAction pageSize.
                         * @member {number} pageSize
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         */
                        ListCloudBackupOperationsAction.prototype.pageSize = 0;
    
                        /**
                         * ListCloudBackupOperationsAction pageToken.
                         * @member {string} pageToken
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         */
                        ListCloudBackupOperationsAction.prototype.pageToken = "";
    
                        /**
                         * Creates a new ListCloudBackupOperationsAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupOperationsAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ListCloudBackupOperationsAction} ListCloudBackupOperationsAction instance
                         */
                        ListCloudBackupOperationsAction.create = function create(properties) {
                            return new ListCloudBackupOperationsAction(properties);
                        };
    
                        /**
                         * Encodes the specified ListCloudBackupOperationsAction message. Does not implicitly {@link google.spanner.executor.v1.ListCloudBackupOperationsAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupOperationsAction} message ListCloudBackupOperationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudBackupOperationsAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.projectId != null && Object.hasOwnProperty.call(message, "projectId"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.projectId);
                            if (message.instanceId != null && Object.hasOwnProperty.call(message, "instanceId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.instanceId);
                            if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int32(message.pageSize);
                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.pageToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ListCloudBackupOperationsAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ListCloudBackupOperationsAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.IListCloudBackupOperationsAction} message ListCloudBackupOperationsAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ListCloudBackupOperationsAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ListCloudBackupOperationsAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ListCloudBackupOperationsAction} ListCloudBackupOperationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudBackupOperationsAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ListCloudBackupOperationsAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.projectId = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.instanceId = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.filter = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.pageSize = reader.int32();
                                        break;
                                    }
                                case 5: {
                                        message.pageToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ListCloudBackupOperationsAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ListCloudBackupOperationsAction} ListCloudBackupOperationsAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ListCloudBackupOperationsAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ListCloudBackupOperationsAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ListCloudBackupOperationsAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                if (!$util.isString(message.projectId))
                                    return "projectId: string expected";
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                if (!$util.isString(message.instanceId))
                                    return "instanceId: string expected";
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                if (!$util.isString(message.filter))
                                    return "filter: string expected";
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                if (!$util.isInteger(message.pageSize))
                                    return "pageSize: integer expected";
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                if (!$util.isString(message.pageToken))
                                    return "pageToken: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a ListCloudBackupOperationsAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ListCloudBackupOperationsAction} ListCloudBackupOperationsAction
                         */
                        ListCloudBackupOperationsAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ListCloudBackupOperationsAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ListCloudBackupOperationsAction();
                            if (object.projectId != null)
                                message.projectId = String(object.projectId);
                            if (object.instanceId != null)
                                message.instanceId = String(object.instanceId);
                            if (object.filter != null)
                                message.filter = String(object.filter);
                            if (object.pageSize != null)
                                message.pageSize = object.pageSize | 0;
                            if (object.pageToken != null)
                                message.pageToken = String(object.pageToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ListCloudBackupOperationsAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {google.spanner.executor.v1.ListCloudBackupOperationsAction} message ListCloudBackupOperationsAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ListCloudBackupOperationsAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.projectId = "";
                                object.instanceId = "";
                                object.filter = "";
                                object.pageSize = 0;
                                object.pageToken = "";
                            }
                            if (message.projectId != null && message.hasOwnProperty("projectId"))
                                object.projectId = message.projectId;
                            if (message.instanceId != null && message.hasOwnProperty("instanceId"))
                                object.instanceId = message.instanceId;
                            if (message.filter != null && message.hasOwnProperty("filter"))
                                object.filter = message.filter;
                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                                object.pageSize = message.pageSize;
                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                                object.pageToken = message.pageToken;
                            return object;
                        };
    
                        /**
                         * Converts this ListCloudBackupOperationsAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ListCloudBackupOperationsAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ListCloudBackupOperationsAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ListCloudBackupOperationsAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ListCloudBackupOperationsAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ListCloudBackupOperationsAction";
                        };
    
                        return ListCloudBackupOperationsAction;
                    })();
    
                    v1.GetOperationAction = (function() {
    
                        /**
                         * Properties of a GetOperationAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGetOperationAction
                         * @property {string|null} [operation] GetOperationAction operation
                         */
    
                        /**
                         * Constructs a new GetOperationAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GetOperationAction.
                         * @implements IGetOperationAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGetOperationAction=} [properties] Properties to set
                         */
                        function GetOperationAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GetOperationAction operation.
                         * @member {string} operation
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @instance
                         */
                        GetOperationAction.prototype.operation = "";
    
                        /**
                         * Creates a new GetOperationAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetOperationAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GetOperationAction} GetOperationAction instance
                         */
                        GetOperationAction.create = function create(properties) {
                            return new GetOperationAction(properties);
                        };
    
                        /**
                         * Encodes the specified GetOperationAction message. Does not implicitly {@link google.spanner.executor.v1.GetOperationAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetOperationAction} message GetOperationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetOperationAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.operation != null && Object.hasOwnProperty.call(message, "operation"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.operation);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GetOperationAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GetOperationAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.IGetOperationAction} message GetOperationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GetOperationAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GetOperationAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GetOperationAction} GetOperationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetOperationAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GetOperationAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.operation = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GetOperationAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GetOperationAction} GetOperationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GetOperationAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GetOperationAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GetOperationAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.operation != null && message.hasOwnProperty("operation"))
                                if (!$util.isString(message.operation))
                                    return "operation: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a GetOperationAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GetOperationAction} GetOperationAction
                         */
                        GetOperationAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GetOperationAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GetOperationAction();
                            if (object.operation != null)
                                message.operation = String(object.operation);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GetOperationAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.GetOperationAction} message GetOperationAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GetOperationAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.operation = "";
                            if (message.operation != null && message.hasOwnProperty("operation"))
                                object.operation = message.operation;
                            return object;
                        };
    
                        /**
                         * Converts this GetOperationAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GetOperationAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GetOperationAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GetOperationAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GetOperationAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GetOperationAction";
                        };
    
                        return GetOperationAction;
                    })();
    
                    v1.QueryCancellationAction = (function() {
    
                        /**
                         * Properties of a QueryCancellationAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IQueryCancellationAction
                         * @property {string|null} [longRunningSql] QueryCancellationAction longRunningSql
                         * @property {string|null} [cancelQuery] QueryCancellationAction cancelQuery
                         */
    
                        /**
                         * Constructs a new QueryCancellationAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a QueryCancellationAction.
                         * @implements IQueryCancellationAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IQueryCancellationAction=} [properties] Properties to set
                         */
                        function QueryCancellationAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * QueryCancellationAction longRunningSql.
                         * @member {string} longRunningSql
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @instance
                         */
                        QueryCancellationAction.prototype.longRunningSql = "";
    
                        /**
                         * QueryCancellationAction cancelQuery.
                         * @member {string} cancelQuery
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @instance
                         */
                        QueryCancellationAction.prototype.cancelQuery = "";
    
                        /**
                         * Creates a new QueryCancellationAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryCancellationAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.QueryCancellationAction} QueryCancellationAction instance
                         */
                        QueryCancellationAction.create = function create(properties) {
                            return new QueryCancellationAction(properties);
                        };
    
                        /**
                         * Encodes the specified QueryCancellationAction message. Does not implicitly {@link google.spanner.executor.v1.QueryCancellationAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryCancellationAction} message QueryCancellationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryCancellationAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.longRunningSql != null && Object.hasOwnProperty.call(message, "longRunningSql"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.longRunningSql);
                            if (message.cancelQuery != null && Object.hasOwnProperty.call(message, "cancelQuery"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.cancelQuery);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified QueryCancellationAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.QueryCancellationAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {google.spanner.executor.v1.IQueryCancellationAction} message QueryCancellationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryCancellationAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a QueryCancellationAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.QueryCancellationAction} QueryCancellationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryCancellationAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.QueryCancellationAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.longRunningSql = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.cancelQuery = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a QueryCancellationAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.QueryCancellationAction} QueryCancellationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryCancellationAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a QueryCancellationAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        QueryCancellationAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.longRunningSql != null && message.hasOwnProperty("longRunningSql"))
                                if (!$util.isString(message.longRunningSql))
                                    return "longRunningSql: string expected";
                            if (message.cancelQuery != null && message.hasOwnProperty("cancelQuery"))
                                if (!$util.isString(message.cancelQuery))
                                    return "cancelQuery: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a QueryCancellationAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.QueryCancellationAction} QueryCancellationAction
                         */
                        QueryCancellationAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.QueryCancellationAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.QueryCancellationAction();
                            if (object.longRunningSql != null)
                                message.longRunningSql = String(object.longRunningSql);
                            if (object.cancelQuery != null)
                                message.cancelQuery = String(object.cancelQuery);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a QueryCancellationAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {google.spanner.executor.v1.QueryCancellationAction} message QueryCancellationAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        QueryCancellationAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.longRunningSql = "";
                                object.cancelQuery = "";
                            }
                            if (message.longRunningSql != null && message.hasOwnProperty("longRunningSql"))
                                object.longRunningSql = message.longRunningSql;
                            if (message.cancelQuery != null && message.hasOwnProperty("cancelQuery"))
                                object.cancelQuery = message.cancelQuery;
                            return object;
                        };
    
                        /**
                         * Converts this QueryCancellationAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        QueryCancellationAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for QueryCancellationAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.QueryCancellationAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        QueryCancellationAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.QueryCancellationAction";
                        };
    
                        return QueryCancellationAction;
                    })();
    
                    v1.CancelOperationAction = (function() {
    
                        /**
                         * Properties of a CancelOperationAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICancelOperationAction
                         * @property {string|null} [operation] CancelOperationAction operation
                         */
    
                        /**
                         * Constructs a new CancelOperationAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CancelOperationAction.
                         * @implements ICancelOperationAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICancelOperationAction=} [properties] Properties to set
                         */
                        function CancelOperationAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CancelOperationAction operation.
                         * @member {string} operation
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @instance
                         */
                        CancelOperationAction.prototype.operation = "";
    
                        /**
                         * Creates a new CancelOperationAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.ICancelOperationAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CancelOperationAction} CancelOperationAction instance
                         */
                        CancelOperationAction.create = function create(properties) {
                            return new CancelOperationAction(properties);
                        };
    
                        /**
                         * Encodes the specified CancelOperationAction message. Does not implicitly {@link google.spanner.executor.v1.CancelOperationAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.ICancelOperationAction} message CancelOperationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CancelOperationAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.operation != null && Object.hasOwnProperty.call(message, "operation"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.operation);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CancelOperationAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CancelOperationAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.ICancelOperationAction} message CancelOperationAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CancelOperationAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CancelOperationAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CancelOperationAction} CancelOperationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CancelOperationAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CancelOperationAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.operation = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CancelOperationAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CancelOperationAction} CancelOperationAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CancelOperationAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CancelOperationAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CancelOperationAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.operation != null && message.hasOwnProperty("operation"))
                                if (!$util.isString(message.operation))
                                    return "operation: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a CancelOperationAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CancelOperationAction} CancelOperationAction
                         */
                        CancelOperationAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CancelOperationAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CancelOperationAction();
                            if (object.operation != null)
                                message.operation = String(object.operation);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CancelOperationAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {google.spanner.executor.v1.CancelOperationAction} message CancelOperationAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CancelOperationAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.operation = "";
                            if (message.operation != null && message.hasOwnProperty("operation"))
                                object.operation = message.operation;
                            return object;
                        };
    
                        /**
                         * Converts this CancelOperationAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CancelOperationAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CancelOperationAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CancelOperationAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CancelOperationAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CancelOperationAction";
                        };
    
                        return CancelOperationAction;
                    })();
    
                    v1.StartBatchTransactionAction = (function() {
    
                        /**
                         * Properties of a StartBatchTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IStartBatchTransactionAction
                         * @property {google.protobuf.ITimestamp|null} [batchTxnTime] StartBatchTransactionAction batchTxnTime
                         * @property {Uint8Array|null} [tid] StartBatchTransactionAction tid
                         * @property {string|null} [cloudDatabaseRole] StartBatchTransactionAction cloudDatabaseRole
                         */
    
                        /**
                         * Constructs a new StartBatchTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a StartBatchTransactionAction.
                         * @implements IStartBatchTransactionAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IStartBatchTransactionAction=} [properties] Properties to set
                         */
                        function StartBatchTransactionAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * StartBatchTransactionAction batchTxnTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} batchTxnTime
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @instance
                         */
                        StartBatchTransactionAction.prototype.batchTxnTime = null;
    
                        /**
                         * StartBatchTransactionAction tid.
                         * @member {Uint8Array|null|undefined} tid
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @instance
                         */
                        StartBatchTransactionAction.prototype.tid = null;
    
                        /**
                         * StartBatchTransactionAction cloudDatabaseRole.
                         * @member {string} cloudDatabaseRole
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @instance
                         */
                        StartBatchTransactionAction.prototype.cloudDatabaseRole = "";
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * StartBatchTransactionAction param.
                         * @member {"batchTxnTime"|"tid"|undefined} param
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @instance
                         */
                        Object.defineProperty(StartBatchTransactionAction.prototype, "param", {
                            get: $util.oneOfGetter($oneOfFields = ["batchTxnTime", "tid"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new StartBatchTransactionAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartBatchTransactionAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.StartBatchTransactionAction} StartBatchTransactionAction instance
                         */
                        StartBatchTransactionAction.create = function create(properties) {
                            return new StartBatchTransactionAction(properties);
                        };
    
                        /**
                         * Encodes the specified StartBatchTransactionAction message. Does not implicitly {@link google.spanner.executor.v1.StartBatchTransactionAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartBatchTransactionAction} message StartBatchTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        StartBatchTransactionAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.batchTxnTime != null && Object.hasOwnProperty.call(message, "batchTxnTime"))
                                $root.google.protobuf.Timestamp.encode(message.batchTxnTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.tid != null && Object.hasOwnProperty.call(message, "tid"))
                                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.tid);
                            if (message.cloudDatabaseRole != null && Object.hasOwnProperty.call(message, "cloudDatabaseRole"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.cloudDatabaseRole);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified StartBatchTransactionAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.StartBatchTransactionAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.IStartBatchTransactionAction} message StartBatchTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        StartBatchTransactionAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a StartBatchTransactionAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.StartBatchTransactionAction} StartBatchTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        StartBatchTransactionAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.StartBatchTransactionAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.batchTxnTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.tid = reader.bytes();
                                        break;
                                    }
                                case 3: {
                                        message.cloudDatabaseRole = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a StartBatchTransactionAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.StartBatchTransactionAction} StartBatchTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        StartBatchTransactionAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a StartBatchTransactionAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        StartBatchTransactionAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.batchTxnTime != null && message.hasOwnProperty("batchTxnTime")) {
                                properties.param = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.batchTxnTime);
                                    if (error)
                                        return "batchTxnTime." + error;
                                }
                            }
                            if (message.tid != null && message.hasOwnProperty("tid")) {
                                if (properties.param === 1)
                                    return "param: multiple values";
                                properties.param = 1;
                                if (!(message.tid && typeof message.tid.length === "number" || $util.isString(message.tid)))
                                    return "tid: buffer expected";
                            }
                            if (message.cloudDatabaseRole != null && message.hasOwnProperty("cloudDatabaseRole"))
                                if (!$util.isString(message.cloudDatabaseRole))
                                    return "cloudDatabaseRole: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a StartBatchTransactionAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.StartBatchTransactionAction} StartBatchTransactionAction
                         */
                        StartBatchTransactionAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.StartBatchTransactionAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.StartBatchTransactionAction();
                            if (object.batchTxnTime != null) {
                                if (typeof object.batchTxnTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.StartBatchTransactionAction.batchTxnTime: object expected");
                                message.batchTxnTime = $root.google.protobuf.Timestamp.fromObject(object.batchTxnTime);
                            }
                            if (object.tid != null)
                                if (typeof object.tid === "string")
                                    $util.base64.decode(object.tid, message.tid = $util.newBuffer($util.base64.length(object.tid)), 0);
                                else if (object.tid.length >= 0)
                                    message.tid = object.tid;
                            if (object.cloudDatabaseRole != null)
                                message.cloudDatabaseRole = String(object.cloudDatabaseRole);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a StartBatchTransactionAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.StartBatchTransactionAction} message StartBatchTransactionAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        StartBatchTransactionAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.cloudDatabaseRole = "";
                            if (message.batchTxnTime != null && message.hasOwnProperty("batchTxnTime")) {
                                object.batchTxnTime = $root.google.protobuf.Timestamp.toObject(message.batchTxnTime, options);
                                if (options.oneofs)
                                    object.param = "batchTxnTime";
                            }
                            if (message.tid != null && message.hasOwnProperty("tid")) {
                                object.tid = options.bytes === String ? $util.base64.encode(message.tid, 0, message.tid.length) : options.bytes === Array ? Array.prototype.slice.call(message.tid) : message.tid;
                                if (options.oneofs)
                                    object.param = "tid";
                            }
                            if (message.cloudDatabaseRole != null && message.hasOwnProperty("cloudDatabaseRole"))
                                object.cloudDatabaseRole = message.cloudDatabaseRole;
                            return object;
                        };
    
                        /**
                         * Converts this StartBatchTransactionAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        StartBatchTransactionAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for StartBatchTransactionAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.StartBatchTransactionAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        StartBatchTransactionAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.StartBatchTransactionAction";
                        };
    
                        return StartBatchTransactionAction;
                    })();
    
                    v1.CloseBatchTransactionAction = (function() {
    
                        /**
                         * Properties of a CloseBatchTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @interface ICloseBatchTransactionAction
                         * @property {boolean|null} [cleanup] CloseBatchTransactionAction cleanup
                         */
    
                        /**
                         * Constructs a new CloseBatchTransactionAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CloseBatchTransactionAction.
                         * @implements ICloseBatchTransactionAction
                         * @constructor
                         * @param {google.spanner.executor.v1.ICloseBatchTransactionAction=} [properties] Properties to set
                         */
                        function CloseBatchTransactionAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CloseBatchTransactionAction cleanup.
                         * @member {boolean} cleanup
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @instance
                         */
                        CloseBatchTransactionAction.prototype.cleanup = false;
    
                        /**
                         * Creates a new CloseBatchTransactionAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.ICloseBatchTransactionAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CloseBatchTransactionAction} CloseBatchTransactionAction instance
                         */
                        CloseBatchTransactionAction.create = function create(properties) {
                            return new CloseBatchTransactionAction(properties);
                        };
    
                        /**
                         * Encodes the specified CloseBatchTransactionAction message. Does not implicitly {@link google.spanner.executor.v1.CloseBatchTransactionAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.ICloseBatchTransactionAction} message CloseBatchTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloseBatchTransactionAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.cleanup != null && Object.hasOwnProperty.call(message, "cleanup"))
                                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.cleanup);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CloseBatchTransactionAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CloseBatchTransactionAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.ICloseBatchTransactionAction} message CloseBatchTransactionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloseBatchTransactionAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CloseBatchTransactionAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CloseBatchTransactionAction} CloseBatchTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloseBatchTransactionAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CloseBatchTransactionAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.cleanup = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CloseBatchTransactionAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CloseBatchTransactionAction} CloseBatchTransactionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloseBatchTransactionAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CloseBatchTransactionAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CloseBatchTransactionAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.cleanup != null && message.hasOwnProperty("cleanup"))
                                if (typeof message.cleanup !== "boolean")
                                    return "cleanup: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a CloseBatchTransactionAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CloseBatchTransactionAction} CloseBatchTransactionAction
                         */
                        CloseBatchTransactionAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CloseBatchTransactionAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CloseBatchTransactionAction();
                            if (object.cleanup != null)
                                message.cleanup = Boolean(object.cleanup);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CloseBatchTransactionAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {google.spanner.executor.v1.CloseBatchTransactionAction} message CloseBatchTransactionAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CloseBatchTransactionAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.cleanup = false;
                            if (message.cleanup != null && message.hasOwnProperty("cleanup"))
                                object.cleanup = message.cleanup;
                            return object;
                        };
    
                        /**
                         * Converts this CloseBatchTransactionAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CloseBatchTransactionAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CloseBatchTransactionAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CloseBatchTransactionAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CloseBatchTransactionAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CloseBatchTransactionAction";
                        };
    
                        return CloseBatchTransactionAction;
                    })();
    
                    v1.GenerateDbPartitionsForReadAction = (function() {
    
                        /**
                         * Properties of a GenerateDbPartitionsForReadAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGenerateDbPartitionsForReadAction
                         * @property {google.spanner.executor.v1.IReadAction|null} [read] GenerateDbPartitionsForReadAction read
                         * @property {Array.<google.spanner.executor.v1.ITableMetadata>|null} [table] GenerateDbPartitionsForReadAction table
                         * @property {number|Long|null} [desiredBytesPerPartition] GenerateDbPartitionsForReadAction desiredBytesPerPartition
                         * @property {number|Long|null} [maxPartitionCount] GenerateDbPartitionsForReadAction maxPartitionCount
                         */
    
                        /**
                         * Constructs a new GenerateDbPartitionsForReadAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GenerateDbPartitionsForReadAction.
                         * @implements IGenerateDbPartitionsForReadAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction=} [properties] Properties to set
                         */
                        function GenerateDbPartitionsForReadAction(properties) {
                            this.table = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GenerateDbPartitionsForReadAction read.
                         * @member {google.spanner.executor.v1.IReadAction|null|undefined} read
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @instance
                         */
                        GenerateDbPartitionsForReadAction.prototype.read = null;
    
                        /**
                         * GenerateDbPartitionsForReadAction table.
                         * @member {Array.<google.spanner.executor.v1.ITableMetadata>} table
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @instance
                         */
                        GenerateDbPartitionsForReadAction.prototype.table = $util.emptyArray;
    
                        /**
                         * GenerateDbPartitionsForReadAction desiredBytesPerPartition.
                         * @member {number|Long|null|undefined} desiredBytesPerPartition
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @instance
                         */
                        GenerateDbPartitionsForReadAction.prototype.desiredBytesPerPartition = null;
    
                        /**
                         * GenerateDbPartitionsForReadAction maxPartitionCount.
                         * @member {number|Long|null|undefined} maxPartitionCount
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @instance
                         */
                        GenerateDbPartitionsForReadAction.prototype.maxPartitionCount = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(GenerateDbPartitionsForReadAction.prototype, "_desiredBytesPerPartition", {
                            get: $util.oneOfGetter($oneOfFields = ["desiredBytesPerPartition"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(GenerateDbPartitionsForReadAction.prototype, "_maxPartitionCount", {
                            get: $util.oneOfGetter($oneOfFields = ["maxPartitionCount"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new GenerateDbPartitionsForReadAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForReadAction} GenerateDbPartitionsForReadAction instance
                         */
                        GenerateDbPartitionsForReadAction.create = function create(properties) {
                            return new GenerateDbPartitionsForReadAction(properties);
                        };
    
                        /**
                         * Encodes the specified GenerateDbPartitionsForReadAction message. Does not implicitly {@link google.spanner.executor.v1.GenerateDbPartitionsForReadAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction} message GenerateDbPartitionsForReadAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GenerateDbPartitionsForReadAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.read != null && Object.hasOwnProperty.call(message, "read"))
                                $root.google.spanner.executor.v1.ReadAction.encode(message.read, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.table != null && message.table.length)
                                for (var i = 0; i < message.table.length; ++i)
                                    $root.google.spanner.executor.v1.TableMetadata.encode(message.table[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.desiredBytesPerPartition != null && Object.hasOwnProperty.call(message, "desiredBytesPerPartition"))
                                writer.uint32(/* id 3, wireType 0 =*/24).int64(message.desiredBytesPerPartition);
                            if (message.maxPartitionCount != null && Object.hasOwnProperty.call(message, "maxPartitionCount"))
                                writer.uint32(/* id 4, wireType 0 =*/32).int64(message.maxPartitionCount);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GenerateDbPartitionsForReadAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GenerateDbPartitionsForReadAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForReadAction} message GenerateDbPartitionsForReadAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GenerateDbPartitionsForReadAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GenerateDbPartitionsForReadAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForReadAction} GenerateDbPartitionsForReadAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GenerateDbPartitionsForReadAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.read = $root.google.spanner.executor.v1.ReadAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        if (!(message.table && message.table.length))
                                            message.table = [];
                                        message.table.push($root.google.spanner.executor.v1.TableMetadata.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        message.desiredBytesPerPartition = reader.int64();
                                        break;
                                    }
                                case 4: {
                                        message.maxPartitionCount = reader.int64();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GenerateDbPartitionsForReadAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForReadAction} GenerateDbPartitionsForReadAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GenerateDbPartitionsForReadAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GenerateDbPartitionsForReadAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GenerateDbPartitionsForReadAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.read != null && message.hasOwnProperty("read")) {
                                var error = $root.google.spanner.executor.v1.ReadAction.verify(message.read);
                                if (error)
                                    return "read." + error;
                            }
                            if (message.table != null && message.hasOwnProperty("table")) {
                                if (!Array.isArray(message.table))
                                    return "table: array expected";
                                for (var i = 0; i < message.table.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.TableMetadata.verify(message.table[i]);
                                    if (error)
                                        return "table." + error;
                                }
                            }
                            if (message.desiredBytesPerPartition != null && message.hasOwnProperty("desiredBytesPerPartition")) {
                                properties._desiredBytesPerPartition = 1;
                                if (!$util.isInteger(message.desiredBytesPerPartition) && !(message.desiredBytesPerPartition && $util.isInteger(message.desiredBytesPerPartition.low) && $util.isInteger(message.desiredBytesPerPartition.high)))
                                    return "desiredBytesPerPartition: integer|Long expected";
                            }
                            if (message.maxPartitionCount != null && message.hasOwnProperty("maxPartitionCount")) {
                                properties._maxPartitionCount = 1;
                                if (!$util.isInteger(message.maxPartitionCount) && !(message.maxPartitionCount && $util.isInteger(message.maxPartitionCount.low) && $util.isInteger(message.maxPartitionCount.high)))
                                    return "maxPartitionCount: integer|Long expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a GenerateDbPartitionsForReadAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForReadAction} GenerateDbPartitionsForReadAction
                         */
                        GenerateDbPartitionsForReadAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GenerateDbPartitionsForReadAction();
                            if (object.read != null) {
                                if (typeof object.read !== "object")
                                    throw TypeError(".google.spanner.executor.v1.GenerateDbPartitionsForReadAction.read: object expected");
                                message.read = $root.google.spanner.executor.v1.ReadAction.fromObject(object.read);
                            }
                            if (object.table) {
                                if (!Array.isArray(object.table))
                                    throw TypeError(".google.spanner.executor.v1.GenerateDbPartitionsForReadAction.table: array expected");
                                message.table = [];
                                for (var i = 0; i < object.table.length; ++i) {
                                    if (typeof object.table[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.GenerateDbPartitionsForReadAction.table: object expected");
                                    message.table[i] = $root.google.spanner.executor.v1.TableMetadata.fromObject(object.table[i]);
                                }
                            }
                            if (object.desiredBytesPerPartition != null)
                                if ($util.Long)
                                    (message.desiredBytesPerPartition = $util.Long.fromValue(object.desiredBytesPerPartition)).unsigned = false;
                                else if (typeof object.desiredBytesPerPartition === "string")
                                    message.desiredBytesPerPartition = parseInt(object.desiredBytesPerPartition, 10);
                                else if (typeof object.desiredBytesPerPartition === "number")
                                    message.desiredBytesPerPartition = object.desiredBytesPerPartition;
                                else if (typeof object.desiredBytesPerPartition === "object")
                                    message.desiredBytesPerPartition = new $util.LongBits(object.desiredBytesPerPartition.low >>> 0, object.desiredBytesPerPartition.high >>> 0).toNumber();
                            if (object.maxPartitionCount != null)
                                if ($util.Long)
                                    (message.maxPartitionCount = $util.Long.fromValue(object.maxPartitionCount)).unsigned = false;
                                else if (typeof object.maxPartitionCount === "string")
                                    message.maxPartitionCount = parseInt(object.maxPartitionCount, 10);
                                else if (typeof object.maxPartitionCount === "number")
                                    message.maxPartitionCount = object.maxPartitionCount;
                                else if (typeof object.maxPartitionCount === "object")
                                    message.maxPartitionCount = new $util.LongBits(object.maxPartitionCount.low >>> 0, object.maxPartitionCount.high >>> 0).toNumber();
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GenerateDbPartitionsForReadAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {google.spanner.executor.v1.GenerateDbPartitionsForReadAction} message GenerateDbPartitionsForReadAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GenerateDbPartitionsForReadAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.table = [];
                            if (options.defaults)
                                object.read = null;
                            if (message.read != null && message.hasOwnProperty("read"))
                                object.read = $root.google.spanner.executor.v1.ReadAction.toObject(message.read, options);
                            if (message.table && message.table.length) {
                                object.table = [];
                                for (var j = 0; j < message.table.length; ++j)
                                    object.table[j] = $root.google.spanner.executor.v1.TableMetadata.toObject(message.table[j], options);
                            }
                            if (message.desiredBytesPerPartition != null && message.hasOwnProperty("desiredBytesPerPartition")) {
                                if (typeof message.desiredBytesPerPartition === "number")
                                    object.desiredBytesPerPartition = options.longs === String ? String(message.desiredBytesPerPartition) : message.desiredBytesPerPartition;
                                else
                                    object.desiredBytesPerPartition = options.longs === String ? $util.Long.prototype.toString.call(message.desiredBytesPerPartition) : options.longs === Number ? new $util.LongBits(message.desiredBytesPerPartition.low >>> 0, message.desiredBytesPerPartition.high >>> 0).toNumber() : message.desiredBytesPerPartition;
                                if (options.oneofs)
                                    object._desiredBytesPerPartition = "desiredBytesPerPartition";
                            }
                            if (message.maxPartitionCount != null && message.hasOwnProperty("maxPartitionCount")) {
                                if (typeof message.maxPartitionCount === "number")
                                    object.maxPartitionCount = options.longs === String ? String(message.maxPartitionCount) : message.maxPartitionCount;
                                else
                                    object.maxPartitionCount = options.longs === String ? $util.Long.prototype.toString.call(message.maxPartitionCount) : options.longs === Number ? new $util.LongBits(message.maxPartitionCount.low >>> 0, message.maxPartitionCount.high >>> 0).toNumber() : message.maxPartitionCount;
                                if (options.oneofs)
                                    object._maxPartitionCount = "maxPartitionCount";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this GenerateDbPartitionsForReadAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GenerateDbPartitionsForReadAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GenerateDbPartitionsForReadAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForReadAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GenerateDbPartitionsForReadAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GenerateDbPartitionsForReadAction";
                        };
    
                        return GenerateDbPartitionsForReadAction;
                    })();
    
                    v1.GenerateDbPartitionsForQueryAction = (function() {
    
                        /**
                         * Properties of a GenerateDbPartitionsForQueryAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IGenerateDbPartitionsForQueryAction
                         * @property {google.spanner.executor.v1.IQueryAction|null} [query] GenerateDbPartitionsForQueryAction query
                         * @property {number|Long|null} [desiredBytesPerPartition] GenerateDbPartitionsForQueryAction desiredBytesPerPartition
                         */
    
                        /**
                         * Constructs a new GenerateDbPartitionsForQueryAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a GenerateDbPartitionsForQueryAction.
                         * @implements IGenerateDbPartitionsForQueryAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction=} [properties] Properties to set
                         */
                        function GenerateDbPartitionsForQueryAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * GenerateDbPartitionsForQueryAction query.
                         * @member {google.spanner.executor.v1.IQueryAction|null|undefined} query
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @instance
                         */
                        GenerateDbPartitionsForQueryAction.prototype.query = null;
    
                        /**
                         * GenerateDbPartitionsForQueryAction desiredBytesPerPartition.
                         * @member {number|Long|null|undefined} desiredBytesPerPartition
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @instance
                         */
                        GenerateDbPartitionsForQueryAction.prototype.desiredBytesPerPartition = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(GenerateDbPartitionsForQueryAction.prototype, "_desiredBytesPerPartition", {
                            get: $util.oneOfGetter($oneOfFields = ["desiredBytesPerPartition"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new GenerateDbPartitionsForQueryAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForQueryAction} GenerateDbPartitionsForQueryAction instance
                         */
                        GenerateDbPartitionsForQueryAction.create = function create(properties) {
                            return new GenerateDbPartitionsForQueryAction(properties);
                        };
    
                        /**
                         * Encodes the specified GenerateDbPartitionsForQueryAction message. Does not implicitly {@link google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction} message GenerateDbPartitionsForQueryAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GenerateDbPartitionsForQueryAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.query != null && Object.hasOwnProperty.call(message, "query"))
                                $root.google.spanner.executor.v1.QueryAction.encode(message.query, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.desiredBytesPerPartition != null && Object.hasOwnProperty.call(message, "desiredBytesPerPartition"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int64(message.desiredBytesPerPartition);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified GenerateDbPartitionsForQueryAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {google.spanner.executor.v1.IGenerateDbPartitionsForQueryAction} message GenerateDbPartitionsForQueryAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        GenerateDbPartitionsForQueryAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a GenerateDbPartitionsForQueryAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForQueryAction} GenerateDbPartitionsForQueryAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GenerateDbPartitionsForQueryAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.query = $root.google.spanner.executor.v1.QueryAction.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.desiredBytesPerPartition = reader.int64();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a GenerateDbPartitionsForQueryAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForQueryAction} GenerateDbPartitionsForQueryAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        GenerateDbPartitionsForQueryAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a GenerateDbPartitionsForQueryAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        GenerateDbPartitionsForQueryAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.query != null && message.hasOwnProperty("query")) {
                                var error = $root.google.spanner.executor.v1.QueryAction.verify(message.query);
                                if (error)
                                    return "query." + error;
                            }
                            if (message.desiredBytesPerPartition != null && message.hasOwnProperty("desiredBytesPerPartition")) {
                                properties._desiredBytesPerPartition = 1;
                                if (!$util.isInteger(message.desiredBytesPerPartition) && !(message.desiredBytesPerPartition && $util.isInteger(message.desiredBytesPerPartition.low) && $util.isInteger(message.desiredBytesPerPartition.high)))
                                    return "desiredBytesPerPartition: integer|Long expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a GenerateDbPartitionsForQueryAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.GenerateDbPartitionsForQueryAction} GenerateDbPartitionsForQueryAction
                         */
                        GenerateDbPartitionsForQueryAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.GenerateDbPartitionsForQueryAction();
                            if (object.query != null) {
                                if (typeof object.query !== "object")
                                    throw TypeError(".google.spanner.executor.v1.GenerateDbPartitionsForQueryAction.query: object expected");
                                message.query = $root.google.spanner.executor.v1.QueryAction.fromObject(object.query);
                            }
                            if (object.desiredBytesPerPartition != null)
                                if ($util.Long)
                                    (message.desiredBytesPerPartition = $util.Long.fromValue(object.desiredBytesPerPartition)).unsigned = false;
                                else if (typeof object.desiredBytesPerPartition === "string")
                                    message.desiredBytesPerPartition = parseInt(object.desiredBytesPerPartition, 10);
                                else if (typeof object.desiredBytesPerPartition === "number")
                                    message.desiredBytesPerPartition = object.desiredBytesPerPartition;
                                else if (typeof object.desiredBytesPerPartition === "object")
                                    message.desiredBytesPerPartition = new $util.LongBits(object.desiredBytesPerPartition.low >>> 0, object.desiredBytesPerPartition.high >>> 0).toNumber();
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a GenerateDbPartitionsForQueryAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {google.spanner.executor.v1.GenerateDbPartitionsForQueryAction} message GenerateDbPartitionsForQueryAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        GenerateDbPartitionsForQueryAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.query = null;
                            if (message.query != null && message.hasOwnProperty("query"))
                                object.query = $root.google.spanner.executor.v1.QueryAction.toObject(message.query, options);
                            if (message.desiredBytesPerPartition != null && message.hasOwnProperty("desiredBytesPerPartition")) {
                                if (typeof message.desiredBytesPerPartition === "number")
                                    object.desiredBytesPerPartition = options.longs === String ? String(message.desiredBytesPerPartition) : message.desiredBytesPerPartition;
                                else
                                    object.desiredBytesPerPartition = options.longs === String ? $util.Long.prototype.toString.call(message.desiredBytesPerPartition) : options.longs === Number ? new $util.LongBits(message.desiredBytesPerPartition.low >>> 0, message.desiredBytesPerPartition.high >>> 0).toNumber() : message.desiredBytesPerPartition;
                                if (options.oneofs)
                                    object._desiredBytesPerPartition = "desiredBytesPerPartition";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this GenerateDbPartitionsForQueryAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        GenerateDbPartitionsForQueryAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for GenerateDbPartitionsForQueryAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.GenerateDbPartitionsForQueryAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        GenerateDbPartitionsForQueryAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.GenerateDbPartitionsForQueryAction";
                        };
    
                        return GenerateDbPartitionsForQueryAction;
                    })();
    
                    v1.BatchPartition = (function() {
    
                        /**
                         * Properties of a BatchPartition.
                         * @memberof google.spanner.executor.v1
                         * @interface IBatchPartition
                         * @property {Uint8Array|null} [partition] BatchPartition partition
                         * @property {Uint8Array|null} [partitionToken] BatchPartition partitionToken
                         * @property {string|null} [table] BatchPartition table
                         * @property {string|null} [index] BatchPartition index
                         */
    
                        /**
                         * Constructs a new BatchPartition.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a BatchPartition.
                         * @implements IBatchPartition
                         * @constructor
                         * @param {google.spanner.executor.v1.IBatchPartition=} [properties] Properties to set
                         */
                        function BatchPartition(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * BatchPartition partition.
                         * @member {Uint8Array} partition
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @instance
                         */
                        BatchPartition.prototype.partition = $util.newBuffer([]);
    
                        /**
                         * BatchPartition partitionToken.
                         * @member {Uint8Array} partitionToken
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @instance
                         */
                        BatchPartition.prototype.partitionToken = $util.newBuffer([]);
    
                        /**
                         * BatchPartition table.
                         * @member {string|null|undefined} table
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @instance
                         */
                        BatchPartition.prototype.table = null;
    
                        /**
                         * BatchPartition index.
                         * @member {string|null|undefined} index
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @instance
                         */
                        BatchPartition.prototype.index = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(BatchPartition.prototype, "_table", {
                            get: $util.oneOfGetter($oneOfFields = ["table"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(BatchPartition.prototype, "_index", {
                            get: $util.oneOfGetter($oneOfFields = ["index"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new BatchPartition instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {google.spanner.executor.v1.IBatchPartition=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.BatchPartition} BatchPartition instance
                         */
                        BatchPartition.create = function create(properties) {
                            return new BatchPartition(properties);
                        };
    
                        /**
                         * Encodes the specified BatchPartition message. Does not implicitly {@link google.spanner.executor.v1.BatchPartition.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {google.spanner.executor.v1.IBatchPartition} message BatchPartition message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        BatchPartition.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.partition != null && Object.hasOwnProperty.call(message, "partition"))
                                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.partition);
                            if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.partitionToken);
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.table);
                            if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.index);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified BatchPartition message, length delimited. Does not implicitly {@link google.spanner.executor.v1.BatchPartition.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {google.spanner.executor.v1.IBatchPartition} message BatchPartition message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        BatchPartition.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a BatchPartition message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.BatchPartition} BatchPartition
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        BatchPartition.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.BatchPartition();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.partition = reader.bytes();
                                        break;
                                    }
                                case 2: {
                                        message.partitionToken = reader.bytes();
                                        break;
                                    }
                                case 3: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.index = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a BatchPartition message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.BatchPartition} BatchPartition
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        BatchPartition.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a BatchPartition message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        BatchPartition.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.partition != null && message.hasOwnProperty("partition"))
                                if (!(message.partition && typeof message.partition.length === "number" || $util.isString(message.partition)))
                                    return "partition: buffer expected";
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                if (!(message.partitionToken && typeof message.partitionToken.length === "number" || $util.isString(message.partitionToken)))
                                    return "partitionToken: buffer expected";
                            if (message.table != null && message.hasOwnProperty("table")) {
                                properties._table = 1;
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            }
                            if (message.index != null && message.hasOwnProperty("index")) {
                                properties._index = 1;
                                if (!$util.isString(message.index))
                                    return "index: string expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a BatchPartition message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.BatchPartition} BatchPartition
                         */
                        BatchPartition.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.BatchPartition)
                                return object;
                            var message = new $root.google.spanner.executor.v1.BatchPartition();
                            if (object.partition != null)
                                if (typeof object.partition === "string")
                                    $util.base64.decode(object.partition, message.partition = $util.newBuffer($util.base64.length(object.partition)), 0);
                                else if (object.partition.length >= 0)
                                    message.partition = object.partition;
                            if (object.partitionToken != null)
                                if (typeof object.partitionToken === "string")
                                    $util.base64.decode(object.partitionToken, message.partitionToken = $util.newBuffer($util.base64.length(object.partitionToken)), 0);
                                else if (object.partitionToken.length >= 0)
                                    message.partitionToken = object.partitionToken;
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.index != null)
                                message.index = String(object.index);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a BatchPartition message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {google.spanner.executor.v1.BatchPartition} message BatchPartition
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        BatchPartition.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                if (options.bytes === String)
                                    object.partition = "";
                                else {
                                    object.partition = [];
                                    if (options.bytes !== Array)
                                        object.partition = $util.newBuffer(object.partition);
                                }
                                if (options.bytes === String)
                                    object.partitionToken = "";
                                else {
                                    object.partitionToken = [];
                                    if (options.bytes !== Array)
                                        object.partitionToken = $util.newBuffer(object.partitionToken);
                                }
                            }
                            if (message.partition != null && message.hasOwnProperty("partition"))
                                object.partition = options.bytes === String ? $util.base64.encode(message.partition, 0, message.partition.length) : options.bytes === Array ? Array.prototype.slice.call(message.partition) : message.partition;
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                object.partitionToken = options.bytes === String ? $util.base64.encode(message.partitionToken, 0, message.partitionToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.partitionToken) : message.partitionToken;
                            if (message.table != null && message.hasOwnProperty("table")) {
                                object.table = message.table;
                                if (options.oneofs)
                                    object._table = "table";
                            }
                            if (message.index != null && message.hasOwnProperty("index")) {
                                object.index = message.index;
                                if (options.oneofs)
                                    object._index = "index";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this BatchPartition to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        BatchPartition.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for BatchPartition
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.BatchPartition
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        BatchPartition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.BatchPartition";
                        };
    
                        return BatchPartition;
                    })();
    
                    v1.ExecutePartitionAction = (function() {
    
                        /**
                         * Properties of an ExecutePartitionAction.
                         * @memberof google.spanner.executor.v1
                         * @interface IExecutePartitionAction
                         * @property {google.spanner.executor.v1.IBatchPartition|null} [partition] ExecutePartitionAction partition
                         */
    
                        /**
                         * Constructs a new ExecutePartitionAction.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an ExecutePartitionAction.
                         * @implements IExecutePartitionAction
                         * @constructor
                         * @param {google.spanner.executor.v1.IExecutePartitionAction=} [properties] Properties to set
                         */
                        function ExecutePartitionAction(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ExecutePartitionAction partition.
                         * @member {google.spanner.executor.v1.IBatchPartition|null|undefined} partition
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @instance
                         */
                        ExecutePartitionAction.prototype.partition = null;
    
                        /**
                         * Creates a new ExecutePartitionAction instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {google.spanner.executor.v1.IExecutePartitionAction=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ExecutePartitionAction} ExecutePartitionAction instance
                         */
                        ExecutePartitionAction.create = function create(properties) {
                            return new ExecutePartitionAction(properties);
                        };
    
                        /**
                         * Encodes the specified ExecutePartitionAction message. Does not implicitly {@link google.spanner.executor.v1.ExecutePartitionAction.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {google.spanner.executor.v1.IExecutePartitionAction} message ExecutePartitionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExecutePartitionAction.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.partition != null && Object.hasOwnProperty.call(message, "partition"))
                                $root.google.spanner.executor.v1.BatchPartition.encode(message.partition, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ExecutePartitionAction message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ExecutePartitionAction.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {google.spanner.executor.v1.IExecutePartitionAction} message ExecutePartitionAction message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExecutePartitionAction.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an ExecutePartitionAction message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ExecutePartitionAction} ExecutePartitionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExecutePartitionAction.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ExecutePartitionAction();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.partition = $root.google.spanner.executor.v1.BatchPartition.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an ExecutePartitionAction message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ExecutePartitionAction} ExecutePartitionAction
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExecutePartitionAction.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an ExecutePartitionAction message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ExecutePartitionAction.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.partition != null && message.hasOwnProperty("partition")) {
                                var error = $root.google.spanner.executor.v1.BatchPartition.verify(message.partition);
                                if (error)
                                    return "partition." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates an ExecutePartitionAction message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ExecutePartitionAction} ExecutePartitionAction
                         */
                        ExecutePartitionAction.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ExecutePartitionAction)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ExecutePartitionAction();
                            if (object.partition != null) {
                                if (typeof object.partition !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ExecutePartitionAction.partition: object expected");
                                message.partition = $root.google.spanner.executor.v1.BatchPartition.fromObject(object.partition);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an ExecutePartitionAction message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {google.spanner.executor.v1.ExecutePartitionAction} message ExecutePartitionAction
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ExecutePartitionAction.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.partition = null;
                            if (message.partition != null && message.hasOwnProperty("partition"))
                                object.partition = $root.google.spanner.executor.v1.BatchPartition.toObject(message.partition, options);
                            return object;
                        };
    
                        /**
                         * Converts this ExecutePartitionAction to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ExecutePartitionAction.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ExecutePartitionAction
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ExecutePartitionAction
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ExecutePartitionAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ExecutePartitionAction";
                        };
    
                        return ExecutePartitionAction;
                    })();
    
                    v1.ExecuteChangeStreamQuery = (function() {
    
                        /**
                         * Properties of an ExecuteChangeStreamQuery.
                         * @memberof google.spanner.executor.v1
                         * @interface IExecuteChangeStreamQuery
                         * @property {string|null} [name] ExecuteChangeStreamQuery name
                         * @property {google.protobuf.ITimestamp|null} [startTime] ExecuteChangeStreamQuery startTime
                         * @property {google.protobuf.ITimestamp|null} [endTime] ExecuteChangeStreamQuery endTime
                         * @property {string|null} [partitionToken] ExecuteChangeStreamQuery partitionToken
                         * @property {Array.<string>|null} [readOptions] ExecuteChangeStreamQuery readOptions
                         * @property {number|null} [heartbeatMilliseconds] ExecuteChangeStreamQuery heartbeatMilliseconds
                         * @property {number|Long|null} [deadlineSeconds] ExecuteChangeStreamQuery deadlineSeconds
                         * @property {string|null} [cloudDatabaseRole] ExecuteChangeStreamQuery cloudDatabaseRole
                         */
    
                        /**
                         * Constructs a new ExecuteChangeStreamQuery.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an ExecuteChangeStreamQuery.
                         * @implements IExecuteChangeStreamQuery
                         * @constructor
                         * @param {google.spanner.executor.v1.IExecuteChangeStreamQuery=} [properties] Properties to set
                         */
                        function ExecuteChangeStreamQuery(properties) {
                            this.readOptions = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ExecuteChangeStreamQuery name.
                         * @member {string} name
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.name = "";
    
                        /**
                         * ExecuteChangeStreamQuery startTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} startTime
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.startTime = null;
    
                        /**
                         * ExecuteChangeStreamQuery endTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} endTime
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.endTime = null;
    
                        /**
                         * ExecuteChangeStreamQuery partitionToken.
                         * @member {string|null|undefined} partitionToken
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.partitionToken = null;
    
                        /**
                         * ExecuteChangeStreamQuery readOptions.
                         * @member {Array.<string>} readOptions
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.readOptions = $util.emptyArray;
    
                        /**
                         * ExecuteChangeStreamQuery heartbeatMilliseconds.
                         * @member {number|null|undefined} heartbeatMilliseconds
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.heartbeatMilliseconds = null;
    
                        /**
                         * ExecuteChangeStreamQuery deadlineSeconds.
                         * @member {number|Long|null|undefined} deadlineSeconds
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.deadlineSeconds = null;
    
                        /**
                         * ExecuteChangeStreamQuery cloudDatabaseRole.
                         * @member {string|null|undefined} cloudDatabaseRole
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         */
                        ExecuteChangeStreamQuery.prototype.cloudDatabaseRole = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ExecuteChangeStreamQuery.prototype, "_endTime", {
                            get: $util.oneOfGetter($oneOfFields = ["endTime"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ExecuteChangeStreamQuery.prototype, "_partitionToken", {
                            get: $util.oneOfGetter($oneOfFields = ["partitionToken"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ExecuteChangeStreamQuery.prototype, "_heartbeatMilliseconds", {
                            get: $util.oneOfGetter($oneOfFields = ["heartbeatMilliseconds"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ExecuteChangeStreamQuery.prototype, "_deadlineSeconds", {
                            get: $util.oneOfGetter($oneOfFields = ["deadlineSeconds"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ExecuteChangeStreamQuery.prototype, "_cloudDatabaseRole", {
                            get: $util.oneOfGetter($oneOfFields = ["cloudDatabaseRole"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ExecuteChangeStreamQuery instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {google.spanner.executor.v1.IExecuteChangeStreamQuery=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ExecuteChangeStreamQuery} ExecuteChangeStreamQuery instance
                         */
                        ExecuteChangeStreamQuery.create = function create(properties) {
                            return new ExecuteChangeStreamQuery(properties);
                        };
    
                        /**
                         * Encodes the specified ExecuteChangeStreamQuery message. Does not implicitly {@link google.spanner.executor.v1.ExecuteChangeStreamQuery.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {google.spanner.executor.v1.IExecuteChangeStreamQuery} message ExecuteChangeStreamQuery message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExecuteChangeStreamQuery.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                            if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                                $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.partitionToken);
                            if (message.readOptions != null && message.readOptions.length)
                                for (var i = 0; i < message.readOptions.length; ++i)
                                    writer.uint32(/* id 5, wireType 2 =*/42).string(message.readOptions[i]);
                            if (message.heartbeatMilliseconds != null && Object.hasOwnProperty.call(message, "heartbeatMilliseconds"))
                                writer.uint32(/* id 6, wireType 0 =*/48).int32(message.heartbeatMilliseconds);
                            if (message.deadlineSeconds != null && Object.hasOwnProperty.call(message, "deadlineSeconds"))
                                writer.uint32(/* id 7, wireType 0 =*/56).int64(message.deadlineSeconds);
                            if (message.cloudDatabaseRole != null && Object.hasOwnProperty.call(message, "cloudDatabaseRole"))
                                writer.uint32(/* id 8, wireType 2 =*/66).string(message.cloudDatabaseRole);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ExecuteChangeStreamQuery message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ExecuteChangeStreamQuery.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {google.spanner.executor.v1.IExecuteChangeStreamQuery} message ExecuteChangeStreamQuery message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExecuteChangeStreamQuery.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an ExecuteChangeStreamQuery message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ExecuteChangeStreamQuery} ExecuteChangeStreamQuery
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExecuteChangeStreamQuery.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ExecuteChangeStreamQuery();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.name = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 4: {
                                        message.partitionToken = reader.string();
                                        break;
                                    }
                                case 5: {
                                        if (!(message.readOptions && message.readOptions.length))
                                            message.readOptions = [];
                                        message.readOptions.push(reader.string());
                                        break;
                                    }
                                case 6: {
                                        message.heartbeatMilliseconds = reader.int32();
                                        break;
                                    }
                                case 7: {
                                        message.deadlineSeconds = reader.int64();
                                        break;
                                    }
                                case 8: {
                                        message.cloudDatabaseRole = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an ExecuteChangeStreamQuery message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ExecuteChangeStreamQuery} ExecuteChangeStreamQuery
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExecuteChangeStreamQuery.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an ExecuteChangeStreamQuery message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ExecuteChangeStreamQuery.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.name != null && message.hasOwnProperty("name"))
                                if (!$util.isString(message.name))
                                    return "name: string expected";
                            if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                if (error)
                                    return "startTime." + error;
                            }
                            if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                properties._endTime = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                                    if (error)
                                        return "endTime." + error;
                                }
                            }
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken")) {
                                properties._partitionToken = 1;
                                if (!$util.isString(message.partitionToken))
                                    return "partitionToken: string expected";
                            }
                            if (message.readOptions != null && message.hasOwnProperty("readOptions")) {
                                if (!Array.isArray(message.readOptions))
                                    return "readOptions: array expected";
                                for (var i = 0; i < message.readOptions.length; ++i)
                                    if (!$util.isString(message.readOptions[i]))
                                        return "readOptions: string[] expected";
                            }
                            if (message.heartbeatMilliseconds != null && message.hasOwnProperty("heartbeatMilliseconds")) {
                                properties._heartbeatMilliseconds = 1;
                                if (!$util.isInteger(message.heartbeatMilliseconds))
                                    return "heartbeatMilliseconds: integer expected";
                            }
                            if (message.deadlineSeconds != null && message.hasOwnProperty("deadlineSeconds")) {
                                properties._deadlineSeconds = 1;
                                if (!$util.isInteger(message.deadlineSeconds) && !(message.deadlineSeconds && $util.isInteger(message.deadlineSeconds.low) && $util.isInteger(message.deadlineSeconds.high)))
                                    return "deadlineSeconds: integer|Long expected";
                            }
                            if (message.cloudDatabaseRole != null && message.hasOwnProperty("cloudDatabaseRole")) {
                                properties._cloudDatabaseRole = 1;
                                if (!$util.isString(message.cloudDatabaseRole))
                                    return "cloudDatabaseRole: string expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates an ExecuteChangeStreamQuery message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ExecuteChangeStreamQuery} ExecuteChangeStreamQuery
                         */
                        ExecuteChangeStreamQuery.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ExecuteChangeStreamQuery)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ExecuteChangeStreamQuery();
                            if (object.name != null)
                                message.name = String(object.name);
                            if (object.startTime != null) {
                                if (typeof object.startTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ExecuteChangeStreamQuery.startTime: object expected");
                                message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                            }
                            if (object.endTime != null) {
                                if (typeof object.endTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ExecuteChangeStreamQuery.endTime: object expected");
                                message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                            }
                            if (object.partitionToken != null)
                                message.partitionToken = String(object.partitionToken);
                            if (object.readOptions) {
                                if (!Array.isArray(object.readOptions))
                                    throw TypeError(".google.spanner.executor.v1.ExecuteChangeStreamQuery.readOptions: array expected");
                                message.readOptions = [];
                                for (var i = 0; i < object.readOptions.length; ++i)
                                    message.readOptions[i] = String(object.readOptions[i]);
                            }
                            if (object.heartbeatMilliseconds != null)
                                message.heartbeatMilliseconds = object.heartbeatMilliseconds | 0;
                            if (object.deadlineSeconds != null)
                                if ($util.Long)
                                    (message.deadlineSeconds = $util.Long.fromValue(object.deadlineSeconds)).unsigned = false;
                                else if (typeof object.deadlineSeconds === "string")
                                    message.deadlineSeconds = parseInt(object.deadlineSeconds, 10);
                                else if (typeof object.deadlineSeconds === "number")
                                    message.deadlineSeconds = object.deadlineSeconds;
                                else if (typeof object.deadlineSeconds === "object")
                                    message.deadlineSeconds = new $util.LongBits(object.deadlineSeconds.low >>> 0, object.deadlineSeconds.high >>> 0).toNumber();
                            if (object.cloudDatabaseRole != null)
                                message.cloudDatabaseRole = String(object.cloudDatabaseRole);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an ExecuteChangeStreamQuery message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {google.spanner.executor.v1.ExecuteChangeStreamQuery} message ExecuteChangeStreamQuery
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ExecuteChangeStreamQuery.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.readOptions = [];
                            if (options.defaults) {
                                object.name = "";
                                object.startTime = null;
                            }
                            if (message.name != null && message.hasOwnProperty("name"))
                                object.name = message.name;
                            if (message.startTime != null && message.hasOwnProperty("startTime"))
                                object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                            if (message.endTime != null && message.hasOwnProperty("endTime")) {
                                object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                                if (options.oneofs)
                                    object._endTime = "endTime";
                            }
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken")) {
                                object.partitionToken = message.partitionToken;
                                if (options.oneofs)
                                    object._partitionToken = "partitionToken";
                            }
                            if (message.readOptions && message.readOptions.length) {
                                object.readOptions = [];
                                for (var j = 0; j < message.readOptions.length; ++j)
                                    object.readOptions[j] = message.readOptions[j];
                            }
                            if (message.heartbeatMilliseconds != null && message.hasOwnProperty("heartbeatMilliseconds")) {
                                object.heartbeatMilliseconds = message.heartbeatMilliseconds;
                                if (options.oneofs)
                                    object._heartbeatMilliseconds = "heartbeatMilliseconds";
                            }
                            if (message.deadlineSeconds != null && message.hasOwnProperty("deadlineSeconds")) {
                                if (typeof message.deadlineSeconds === "number")
                                    object.deadlineSeconds = options.longs === String ? String(message.deadlineSeconds) : message.deadlineSeconds;
                                else
                                    object.deadlineSeconds = options.longs === String ? $util.Long.prototype.toString.call(message.deadlineSeconds) : options.longs === Number ? new $util.LongBits(message.deadlineSeconds.low >>> 0, message.deadlineSeconds.high >>> 0).toNumber() : message.deadlineSeconds;
                                if (options.oneofs)
                                    object._deadlineSeconds = "deadlineSeconds";
                            }
                            if (message.cloudDatabaseRole != null && message.hasOwnProperty("cloudDatabaseRole")) {
                                object.cloudDatabaseRole = message.cloudDatabaseRole;
                                if (options.oneofs)
                                    object._cloudDatabaseRole = "cloudDatabaseRole";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ExecuteChangeStreamQuery to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ExecuteChangeStreamQuery.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ExecuteChangeStreamQuery
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ExecuteChangeStreamQuery
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ExecuteChangeStreamQuery.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ExecuteChangeStreamQuery";
                        };
    
                        return ExecuteChangeStreamQuery;
                    })();
    
                    v1.SpannerActionOutcome = (function() {
    
                        /**
                         * Properties of a SpannerActionOutcome.
                         * @memberof google.spanner.executor.v1
                         * @interface ISpannerActionOutcome
                         * @property {google.rpc.IStatus|null} [status] SpannerActionOutcome status
                         * @property {google.protobuf.ITimestamp|null} [commitTime] SpannerActionOutcome commitTime
                         * @property {google.spanner.executor.v1.IReadResult|null} [readResult] SpannerActionOutcome readResult
                         * @property {google.spanner.executor.v1.IQueryResult|null} [queryResult] SpannerActionOutcome queryResult
                         * @property {boolean|null} [transactionRestarted] SpannerActionOutcome transactionRestarted
                         * @property {Uint8Array|null} [batchTxnId] SpannerActionOutcome batchTxnId
                         * @property {Array.<google.spanner.executor.v1.IBatchPartition>|null} [dbPartition] SpannerActionOutcome dbPartition
                         * @property {google.spanner.executor.v1.IAdminResult|null} [adminResult] SpannerActionOutcome adminResult
                         * @property {Array.<number|Long>|null} [dmlRowsModified] SpannerActionOutcome dmlRowsModified
                         * @property {Array.<google.spanner.executor.v1.IChangeStreamRecord>|null} [changeStreamRecords] SpannerActionOutcome changeStreamRecords
                         */
    
                        /**
                         * Constructs a new SpannerActionOutcome.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerActionOutcome.
                         * @implements ISpannerActionOutcome
                         * @constructor
                         * @param {google.spanner.executor.v1.ISpannerActionOutcome=} [properties] Properties to set
                         */
                        function SpannerActionOutcome(properties) {
                            this.dbPartition = [];
                            this.dmlRowsModified = [];
                            this.changeStreamRecords = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SpannerActionOutcome status.
                         * @member {google.rpc.IStatus|null|undefined} status
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.status = null;
    
                        /**
                         * SpannerActionOutcome commitTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} commitTime
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.commitTime = null;
    
                        /**
                         * SpannerActionOutcome readResult.
                         * @member {google.spanner.executor.v1.IReadResult|null|undefined} readResult
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.readResult = null;
    
                        /**
                         * SpannerActionOutcome queryResult.
                         * @member {google.spanner.executor.v1.IQueryResult|null|undefined} queryResult
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.queryResult = null;
    
                        /**
                         * SpannerActionOutcome transactionRestarted.
                         * @member {boolean|null|undefined} transactionRestarted
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.transactionRestarted = null;
    
                        /**
                         * SpannerActionOutcome batchTxnId.
                         * @member {Uint8Array|null|undefined} batchTxnId
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.batchTxnId = null;
    
                        /**
                         * SpannerActionOutcome dbPartition.
                         * @member {Array.<google.spanner.executor.v1.IBatchPartition>} dbPartition
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.dbPartition = $util.emptyArray;
    
                        /**
                         * SpannerActionOutcome adminResult.
                         * @member {google.spanner.executor.v1.IAdminResult|null|undefined} adminResult
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.adminResult = null;
    
                        /**
                         * SpannerActionOutcome dmlRowsModified.
                         * @member {Array.<number|Long>} dmlRowsModified
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.dmlRowsModified = $util.emptyArray;
    
                        /**
                         * SpannerActionOutcome changeStreamRecords.
                         * @member {Array.<google.spanner.executor.v1.IChangeStreamRecord>} changeStreamRecords
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         */
                        SpannerActionOutcome.prototype.changeStreamRecords = $util.emptyArray;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_status", {
                            get: $util.oneOfGetter($oneOfFields = ["status"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_commitTime", {
                            get: $util.oneOfGetter($oneOfFields = ["commitTime"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_readResult", {
                            get: $util.oneOfGetter($oneOfFields = ["readResult"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_queryResult", {
                            get: $util.oneOfGetter($oneOfFields = ["queryResult"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_transactionRestarted", {
                            get: $util.oneOfGetter($oneOfFields = ["transactionRestarted"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_batchTxnId", {
                            get: $util.oneOfGetter($oneOfFields = ["batchTxnId"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(SpannerActionOutcome.prototype, "_adminResult", {
                            get: $util.oneOfGetter($oneOfFields = ["adminResult"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new SpannerActionOutcome instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerActionOutcome=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SpannerActionOutcome} SpannerActionOutcome instance
                         */
                        SpannerActionOutcome.create = function create(properties) {
                            return new SpannerActionOutcome(properties);
                        };
    
                        /**
                         * Encodes the specified SpannerActionOutcome message. Does not implicitly {@link google.spanner.executor.v1.SpannerActionOutcome.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerActionOutcome} message SpannerActionOutcome message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerActionOutcome.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                                $root.google.rpc.Status.encode(message.status, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.commitTime != null && Object.hasOwnProperty.call(message, "commitTime"))
                                $root.google.protobuf.Timestamp.encode(message.commitTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.readResult != null && Object.hasOwnProperty.call(message, "readResult"))
                                $root.google.spanner.executor.v1.ReadResult.encode(message.readResult, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            if (message.queryResult != null && Object.hasOwnProperty.call(message, "queryResult"))
                                $root.google.spanner.executor.v1.QueryResult.encode(message.queryResult, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.transactionRestarted != null && Object.hasOwnProperty.call(message, "transactionRestarted"))
                                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.transactionRestarted);
                            if (message.batchTxnId != null && Object.hasOwnProperty.call(message, "batchTxnId"))
                                writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.batchTxnId);
                            if (message.dbPartition != null && message.dbPartition.length)
                                for (var i = 0; i < message.dbPartition.length; ++i)
                                    $root.google.spanner.executor.v1.BatchPartition.encode(message.dbPartition[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            if (message.adminResult != null && Object.hasOwnProperty.call(message, "adminResult"))
                                $root.google.spanner.executor.v1.AdminResult.encode(message.adminResult, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                            if (message.dmlRowsModified != null && message.dmlRowsModified.length) {
                                writer.uint32(/* id 9, wireType 2 =*/74).fork();
                                for (var i = 0; i < message.dmlRowsModified.length; ++i)
                                    writer.int64(message.dmlRowsModified[i]);
                                writer.ldelim();
                            }
                            if (message.changeStreamRecords != null && message.changeStreamRecords.length)
                                for (var i = 0; i < message.changeStreamRecords.length; ++i)
                                    $root.google.spanner.executor.v1.ChangeStreamRecord.encode(message.changeStreamRecords[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SpannerActionOutcome message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SpannerActionOutcome.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerActionOutcome} message SpannerActionOutcome message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerActionOutcome.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SpannerActionOutcome message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SpannerActionOutcome} SpannerActionOutcome
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerActionOutcome.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SpannerActionOutcome();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.status = $root.google.rpc.Status.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.commitTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.readResult = $root.google.spanner.executor.v1.ReadResult.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 4: {
                                        message.queryResult = $root.google.spanner.executor.v1.QueryResult.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        message.transactionRestarted = reader.bool();
                                        break;
                                    }
                                case 6: {
                                        message.batchTxnId = reader.bytes();
                                        break;
                                    }
                                case 7: {
                                        if (!(message.dbPartition && message.dbPartition.length))
                                            message.dbPartition = [];
                                        message.dbPartition.push($root.google.spanner.executor.v1.BatchPartition.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 8: {
                                        message.adminResult = $root.google.spanner.executor.v1.AdminResult.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 9: {
                                        if (!(message.dmlRowsModified && message.dmlRowsModified.length))
                                            message.dmlRowsModified = [];
                                        if ((tag & 7) === 2) {
                                            var end2 = reader.uint32() + reader.pos;
                                            while (reader.pos < end2)
                                                message.dmlRowsModified.push(reader.int64());
                                        } else
                                            message.dmlRowsModified.push(reader.int64());
                                        break;
                                    }
                                case 10: {
                                        if (!(message.changeStreamRecords && message.changeStreamRecords.length))
                                            message.changeStreamRecords = [];
                                        message.changeStreamRecords.push($root.google.spanner.executor.v1.ChangeStreamRecord.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SpannerActionOutcome message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SpannerActionOutcome} SpannerActionOutcome
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerActionOutcome.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SpannerActionOutcome message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SpannerActionOutcome.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.status != null && message.hasOwnProperty("status")) {
                                properties._status = 1;
                                {
                                    var error = $root.google.rpc.Status.verify(message.status);
                                    if (error)
                                        return "status." + error;
                                }
                            }
                            if (message.commitTime != null && message.hasOwnProperty("commitTime")) {
                                properties._commitTime = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.commitTime);
                                    if (error)
                                        return "commitTime." + error;
                                }
                            }
                            if (message.readResult != null && message.hasOwnProperty("readResult")) {
                                properties._readResult = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ReadResult.verify(message.readResult);
                                    if (error)
                                        return "readResult." + error;
                                }
                            }
                            if (message.queryResult != null && message.hasOwnProperty("queryResult")) {
                                properties._queryResult = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.QueryResult.verify(message.queryResult);
                                    if (error)
                                        return "queryResult." + error;
                                }
                            }
                            if (message.transactionRestarted != null && message.hasOwnProperty("transactionRestarted")) {
                                properties._transactionRestarted = 1;
                                if (typeof message.transactionRestarted !== "boolean")
                                    return "transactionRestarted: boolean expected";
                            }
                            if (message.batchTxnId != null && message.hasOwnProperty("batchTxnId")) {
                                properties._batchTxnId = 1;
                                if (!(message.batchTxnId && typeof message.batchTxnId.length === "number" || $util.isString(message.batchTxnId)))
                                    return "batchTxnId: buffer expected";
                            }
                            if (message.dbPartition != null && message.hasOwnProperty("dbPartition")) {
                                if (!Array.isArray(message.dbPartition))
                                    return "dbPartition: array expected";
                                for (var i = 0; i < message.dbPartition.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.BatchPartition.verify(message.dbPartition[i]);
                                    if (error)
                                        return "dbPartition." + error;
                                }
                            }
                            if (message.adminResult != null && message.hasOwnProperty("adminResult")) {
                                properties._adminResult = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.AdminResult.verify(message.adminResult);
                                    if (error)
                                        return "adminResult." + error;
                                }
                            }
                            if (message.dmlRowsModified != null && message.hasOwnProperty("dmlRowsModified")) {
                                if (!Array.isArray(message.dmlRowsModified))
                                    return "dmlRowsModified: array expected";
                                for (var i = 0; i < message.dmlRowsModified.length; ++i)
                                    if (!$util.isInteger(message.dmlRowsModified[i]) && !(message.dmlRowsModified[i] && $util.isInteger(message.dmlRowsModified[i].low) && $util.isInteger(message.dmlRowsModified[i].high)))
                                        return "dmlRowsModified: integer|Long[] expected";
                            }
                            if (message.changeStreamRecords != null && message.hasOwnProperty("changeStreamRecords")) {
                                if (!Array.isArray(message.changeStreamRecords))
                                    return "changeStreamRecords: array expected";
                                for (var i = 0; i < message.changeStreamRecords.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ChangeStreamRecord.verify(message.changeStreamRecords[i]);
                                    if (error)
                                        return "changeStreamRecords." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a SpannerActionOutcome message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SpannerActionOutcome} SpannerActionOutcome
                         */
                        SpannerActionOutcome.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SpannerActionOutcome)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SpannerActionOutcome();
                            if (object.status != null) {
                                if (typeof object.status !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.status: object expected");
                                message.status = $root.google.rpc.Status.fromObject(object.status);
                            }
                            if (object.commitTime != null) {
                                if (typeof object.commitTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.commitTime: object expected");
                                message.commitTime = $root.google.protobuf.Timestamp.fromObject(object.commitTime);
                            }
                            if (object.readResult != null) {
                                if (typeof object.readResult !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.readResult: object expected");
                                message.readResult = $root.google.spanner.executor.v1.ReadResult.fromObject(object.readResult);
                            }
                            if (object.queryResult != null) {
                                if (typeof object.queryResult !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.queryResult: object expected");
                                message.queryResult = $root.google.spanner.executor.v1.QueryResult.fromObject(object.queryResult);
                            }
                            if (object.transactionRestarted != null)
                                message.transactionRestarted = Boolean(object.transactionRestarted);
                            if (object.batchTxnId != null)
                                if (typeof object.batchTxnId === "string")
                                    $util.base64.decode(object.batchTxnId, message.batchTxnId = $util.newBuffer($util.base64.length(object.batchTxnId)), 0);
                                else if (object.batchTxnId.length >= 0)
                                    message.batchTxnId = object.batchTxnId;
                            if (object.dbPartition) {
                                if (!Array.isArray(object.dbPartition))
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.dbPartition: array expected");
                                message.dbPartition = [];
                                for (var i = 0; i < object.dbPartition.length; ++i) {
                                    if (typeof object.dbPartition[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.dbPartition: object expected");
                                    message.dbPartition[i] = $root.google.spanner.executor.v1.BatchPartition.fromObject(object.dbPartition[i]);
                                }
                            }
                            if (object.adminResult != null) {
                                if (typeof object.adminResult !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.adminResult: object expected");
                                message.adminResult = $root.google.spanner.executor.v1.AdminResult.fromObject(object.adminResult);
                            }
                            if (object.dmlRowsModified) {
                                if (!Array.isArray(object.dmlRowsModified))
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.dmlRowsModified: array expected");
                                message.dmlRowsModified = [];
                                for (var i = 0; i < object.dmlRowsModified.length; ++i)
                                    if ($util.Long)
                                        (message.dmlRowsModified[i] = $util.Long.fromValue(object.dmlRowsModified[i])).unsigned = false;
                                    else if (typeof object.dmlRowsModified[i] === "string")
                                        message.dmlRowsModified[i] = parseInt(object.dmlRowsModified[i], 10);
                                    else if (typeof object.dmlRowsModified[i] === "number")
                                        message.dmlRowsModified[i] = object.dmlRowsModified[i];
                                    else if (typeof object.dmlRowsModified[i] === "object")
                                        message.dmlRowsModified[i] = new $util.LongBits(object.dmlRowsModified[i].low >>> 0, object.dmlRowsModified[i].high >>> 0).toNumber();
                            }
                            if (object.changeStreamRecords) {
                                if (!Array.isArray(object.changeStreamRecords))
                                    throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.changeStreamRecords: array expected");
                                message.changeStreamRecords = [];
                                for (var i = 0; i < object.changeStreamRecords.length; ++i) {
                                    if (typeof object.changeStreamRecords[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.SpannerActionOutcome.changeStreamRecords: object expected");
                                    message.changeStreamRecords[i] = $root.google.spanner.executor.v1.ChangeStreamRecord.fromObject(object.changeStreamRecords[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SpannerActionOutcome message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {google.spanner.executor.v1.SpannerActionOutcome} message SpannerActionOutcome
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SpannerActionOutcome.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.dbPartition = [];
                                object.dmlRowsModified = [];
                                object.changeStreamRecords = [];
                            }
                            if (message.status != null && message.hasOwnProperty("status")) {
                                object.status = $root.google.rpc.Status.toObject(message.status, options);
                                if (options.oneofs)
                                    object._status = "status";
                            }
                            if (message.commitTime != null && message.hasOwnProperty("commitTime")) {
                                object.commitTime = $root.google.protobuf.Timestamp.toObject(message.commitTime, options);
                                if (options.oneofs)
                                    object._commitTime = "commitTime";
                            }
                            if (message.readResult != null && message.hasOwnProperty("readResult")) {
                                object.readResult = $root.google.spanner.executor.v1.ReadResult.toObject(message.readResult, options);
                                if (options.oneofs)
                                    object._readResult = "readResult";
                            }
                            if (message.queryResult != null && message.hasOwnProperty("queryResult")) {
                                object.queryResult = $root.google.spanner.executor.v1.QueryResult.toObject(message.queryResult, options);
                                if (options.oneofs)
                                    object._queryResult = "queryResult";
                            }
                            if (message.transactionRestarted != null && message.hasOwnProperty("transactionRestarted")) {
                                object.transactionRestarted = message.transactionRestarted;
                                if (options.oneofs)
                                    object._transactionRestarted = "transactionRestarted";
                            }
                            if (message.batchTxnId != null && message.hasOwnProperty("batchTxnId")) {
                                object.batchTxnId = options.bytes === String ? $util.base64.encode(message.batchTxnId, 0, message.batchTxnId.length) : options.bytes === Array ? Array.prototype.slice.call(message.batchTxnId) : message.batchTxnId;
                                if (options.oneofs)
                                    object._batchTxnId = "batchTxnId";
                            }
                            if (message.dbPartition && message.dbPartition.length) {
                                object.dbPartition = [];
                                for (var j = 0; j < message.dbPartition.length; ++j)
                                    object.dbPartition[j] = $root.google.spanner.executor.v1.BatchPartition.toObject(message.dbPartition[j], options);
                            }
                            if (message.adminResult != null && message.hasOwnProperty("adminResult")) {
                                object.adminResult = $root.google.spanner.executor.v1.AdminResult.toObject(message.adminResult, options);
                                if (options.oneofs)
                                    object._adminResult = "adminResult";
                            }
                            if (message.dmlRowsModified && message.dmlRowsModified.length) {
                                object.dmlRowsModified = [];
                                for (var j = 0; j < message.dmlRowsModified.length; ++j)
                                    if (typeof message.dmlRowsModified[j] === "number")
                                        object.dmlRowsModified[j] = options.longs === String ? String(message.dmlRowsModified[j]) : message.dmlRowsModified[j];
                                    else
                                        object.dmlRowsModified[j] = options.longs === String ? $util.Long.prototype.toString.call(message.dmlRowsModified[j]) : options.longs === Number ? new $util.LongBits(message.dmlRowsModified[j].low >>> 0, message.dmlRowsModified[j].high >>> 0).toNumber() : message.dmlRowsModified[j];
                            }
                            if (message.changeStreamRecords && message.changeStreamRecords.length) {
                                object.changeStreamRecords = [];
                                for (var j = 0; j < message.changeStreamRecords.length; ++j)
                                    object.changeStreamRecords[j] = $root.google.spanner.executor.v1.ChangeStreamRecord.toObject(message.changeStreamRecords[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this SpannerActionOutcome to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SpannerActionOutcome.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SpannerActionOutcome
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SpannerActionOutcome
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SpannerActionOutcome.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SpannerActionOutcome";
                        };
    
                        return SpannerActionOutcome;
                    })();
    
                    v1.AdminResult = (function() {
    
                        /**
                         * Properties of an AdminResult.
                         * @memberof google.spanner.executor.v1
                         * @interface IAdminResult
                         * @property {google.spanner.executor.v1.ICloudBackupResponse|null} [backupResponse] AdminResult backupResponse
                         * @property {google.spanner.executor.v1.IOperationResponse|null} [operationResponse] AdminResult operationResponse
                         * @property {google.spanner.executor.v1.ICloudDatabaseResponse|null} [databaseResponse] AdminResult databaseResponse
                         * @property {google.spanner.executor.v1.ICloudInstanceResponse|null} [instanceResponse] AdminResult instanceResponse
                         * @property {google.spanner.executor.v1.ICloudInstanceConfigResponse|null} [instanceConfigResponse] AdminResult instanceConfigResponse
                         */
    
                        /**
                         * Constructs a new AdminResult.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an AdminResult.
                         * @implements IAdminResult
                         * @constructor
                         * @param {google.spanner.executor.v1.IAdminResult=} [properties] Properties to set
                         */
                        function AdminResult(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * AdminResult backupResponse.
                         * @member {google.spanner.executor.v1.ICloudBackupResponse|null|undefined} backupResponse
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         */
                        AdminResult.prototype.backupResponse = null;
    
                        /**
                         * AdminResult operationResponse.
                         * @member {google.spanner.executor.v1.IOperationResponse|null|undefined} operationResponse
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         */
                        AdminResult.prototype.operationResponse = null;
    
                        /**
                         * AdminResult databaseResponse.
                         * @member {google.spanner.executor.v1.ICloudDatabaseResponse|null|undefined} databaseResponse
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         */
                        AdminResult.prototype.databaseResponse = null;
    
                        /**
                         * AdminResult instanceResponse.
                         * @member {google.spanner.executor.v1.ICloudInstanceResponse|null|undefined} instanceResponse
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         */
                        AdminResult.prototype.instanceResponse = null;
    
                        /**
                         * AdminResult instanceConfigResponse.
                         * @member {google.spanner.executor.v1.ICloudInstanceConfigResponse|null|undefined} instanceConfigResponse
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         */
                        AdminResult.prototype.instanceConfigResponse = null;
    
                        /**
                         * Creates a new AdminResult instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {google.spanner.executor.v1.IAdminResult=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.AdminResult} AdminResult instance
                         */
                        AdminResult.create = function create(properties) {
                            return new AdminResult(properties);
                        };
    
                        /**
                         * Encodes the specified AdminResult message. Does not implicitly {@link google.spanner.executor.v1.AdminResult.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {google.spanner.executor.v1.IAdminResult} message AdminResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        AdminResult.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.backupResponse != null && Object.hasOwnProperty.call(message, "backupResponse"))
                                $root.google.spanner.executor.v1.CloudBackupResponse.encode(message.backupResponse, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.operationResponse != null && Object.hasOwnProperty.call(message, "operationResponse"))
                                $root.google.spanner.executor.v1.OperationResponse.encode(message.operationResponse, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.databaseResponse != null && Object.hasOwnProperty.call(message, "databaseResponse"))
                                $root.google.spanner.executor.v1.CloudDatabaseResponse.encode(message.databaseResponse, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            if (message.instanceResponse != null && Object.hasOwnProperty.call(message, "instanceResponse"))
                                $root.google.spanner.executor.v1.CloudInstanceResponse.encode(message.instanceResponse, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.instanceConfigResponse != null && Object.hasOwnProperty.call(message, "instanceConfigResponse"))
                                $root.google.spanner.executor.v1.CloudInstanceConfigResponse.encode(message.instanceConfigResponse, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified AdminResult message, length delimited. Does not implicitly {@link google.spanner.executor.v1.AdminResult.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {google.spanner.executor.v1.IAdminResult} message AdminResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        AdminResult.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an AdminResult message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.AdminResult} AdminResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        AdminResult.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.AdminResult();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.backupResponse = $root.google.spanner.executor.v1.CloudBackupResponse.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.operationResponse = $root.google.spanner.executor.v1.OperationResponse.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.databaseResponse = $root.google.spanner.executor.v1.CloudDatabaseResponse.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 4: {
                                        message.instanceResponse = $root.google.spanner.executor.v1.CloudInstanceResponse.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        message.instanceConfigResponse = $root.google.spanner.executor.v1.CloudInstanceConfigResponse.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an AdminResult message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.AdminResult} AdminResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        AdminResult.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an AdminResult message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        AdminResult.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.backupResponse != null && message.hasOwnProperty("backupResponse")) {
                                var error = $root.google.spanner.executor.v1.CloudBackupResponse.verify(message.backupResponse);
                                if (error)
                                    return "backupResponse." + error;
                            }
                            if (message.operationResponse != null && message.hasOwnProperty("operationResponse")) {
                                var error = $root.google.spanner.executor.v1.OperationResponse.verify(message.operationResponse);
                                if (error)
                                    return "operationResponse." + error;
                            }
                            if (message.databaseResponse != null && message.hasOwnProperty("databaseResponse")) {
                                var error = $root.google.spanner.executor.v1.CloudDatabaseResponse.verify(message.databaseResponse);
                                if (error)
                                    return "databaseResponse." + error;
                            }
                            if (message.instanceResponse != null && message.hasOwnProperty("instanceResponse")) {
                                var error = $root.google.spanner.executor.v1.CloudInstanceResponse.verify(message.instanceResponse);
                                if (error)
                                    return "instanceResponse." + error;
                            }
                            if (message.instanceConfigResponse != null && message.hasOwnProperty("instanceConfigResponse")) {
                                var error = $root.google.spanner.executor.v1.CloudInstanceConfigResponse.verify(message.instanceConfigResponse);
                                if (error)
                                    return "instanceConfigResponse." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates an AdminResult message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.AdminResult} AdminResult
                         */
                        AdminResult.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.AdminResult)
                                return object;
                            var message = new $root.google.spanner.executor.v1.AdminResult();
                            if (object.backupResponse != null) {
                                if (typeof object.backupResponse !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminResult.backupResponse: object expected");
                                message.backupResponse = $root.google.spanner.executor.v1.CloudBackupResponse.fromObject(object.backupResponse);
                            }
                            if (object.operationResponse != null) {
                                if (typeof object.operationResponse !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminResult.operationResponse: object expected");
                                message.operationResponse = $root.google.spanner.executor.v1.OperationResponse.fromObject(object.operationResponse);
                            }
                            if (object.databaseResponse != null) {
                                if (typeof object.databaseResponse !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminResult.databaseResponse: object expected");
                                message.databaseResponse = $root.google.spanner.executor.v1.CloudDatabaseResponse.fromObject(object.databaseResponse);
                            }
                            if (object.instanceResponse != null) {
                                if (typeof object.instanceResponse !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminResult.instanceResponse: object expected");
                                message.instanceResponse = $root.google.spanner.executor.v1.CloudInstanceResponse.fromObject(object.instanceResponse);
                            }
                            if (object.instanceConfigResponse != null) {
                                if (typeof object.instanceConfigResponse !== "object")
                                    throw TypeError(".google.spanner.executor.v1.AdminResult.instanceConfigResponse: object expected");
                                message.instanceConfigResponse = $root.google.spanner.executor.v1.CloudInstanceConfigResponse.fromObject(object.instanceConfigResponse);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an AdminResult message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {google.spanner.executor.v1.AdminResult} message AdminResult
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        AdminResult.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.backupResponse = null;
                                object.operationResponse = null;
                                object.databaseResponse = null;
                                object.instanceResponse = null;
                                object.instanceConfigResponse = null;
                            }
                            if (message.backupResponse != null && message.hasOwnProperty("backupResponse"))
                                object.backupResponse = $root.google.spanner.executor.v1.CloudBackupResponse.toObject(message.backupResponse, options);
                            if (message.operationResponse != null && message.hasOwnProperty("operationResponse"))
                                object.operationResponse = $root.google.spanner.executor.v1.OperationResponse.toObject(message.operationResponse, options);
                            if (message.databaseResponse != null && message.hasOwnProperty("databaseResponse"))
                                object.databaseResponse = $root.google.spanner.executor.v1.CloudDatabaseResponse.toObject(message.databaseResponse, options);
                            if (message.instanceResponse != null && message.hasOwnProperty("instanceResponse"))
                                object.instanceResponse = $root.google.spanner.executor.v1.CloudInstanceResponse.toObject(message.instanceResponse, options);
                            if (message.instanceConfigResponse != null && message.hasOwnProperty("instanceConfigResponse"))
                                object.instanceConfigResponse = $root.google.spanner.executor.v1.CloudInstanceConfigResponse.toObject(message.instanceConfigResponse, options);
                            return object;
                        };
    
                        /**
                         * Converts this AdminResult to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        AdminResult.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for AdminResult
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.AdminResult
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        AdminResult.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.AdminResult";
                        };
    
                        return AdminResult;
                    })();
    
                    v1.CloudBackupResponse = (function() {
    
                        /**
                         * Properties of a CloudBackupResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface ICloudBackupResponse
                         * @property {Array.<google.spanner.admin.database.v1.IBackup>|null} [listedBackups] CloudBackupResponse listedBackups
                         * @property {Array.<google.longrunning.IOperation>|null} [listedBackupOperations] CloudBackupResponse listedBackupOperations
                         * @property {string|null} [nextPageToken] CloudBackupResponse nextPageToken
                         * @property {google.spanner.admin.database.v1.IBackup|null} [backup] CloudBackupResponse backup
                         */
    
                        /**
                         * Constructs a new CloudBackupResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CloudBackupResponse.
                         * @implements ICloudBackupResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.ICloudBackupResponse=} [properties] Properties to set
                         */
                        function CloudBackupResponse(properties) {
                            this.listedBackups = [];
                            this.listedBackupOperations = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CloudBackupResponse listedBackups.
                         * @member {Array.<google.spanner.admin.database.v1.IBackup>} listedBackups
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @instance
                         */
                        CloudBackupResponse.prototype.listedBackups = $util.emptyArray;
    
                        /**
                         * CloudBackupResponse listedBackupOperations.
                         * @member {Array.<google.longrunning.IOperation>} listedBackupOperations
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @instance
                         */
                        CloudBackupResponse.prototype.listedBackupOperations = $util.emptyArray;
    
                        /**
                         * CloudBackupResponse nextPageToken.
                         * @member {string} nextPageToken
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @instance
                         */
                        CloudBackupResponse.prototype.nextPageToken = "";
    
                        /**
                         * CloudBackupResponse backup.
                         * @member {google.spanner.admin.database.v1.IBackup|null|undefined} backup
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @instance
                         */
                        CloudBackupResponse.prototype.backup = null;
    
                        /**
                         * Creates a new CloudBackupResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudBackupResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CloudBackupResponse} CloudBackupResponse instance
                         */
                        CloudBackupResponse.create = function create(properties) {
                            return new CloudBackupResponse(properties);
                        };
    
                        /**
                         * Encodes the specified CloudBackupResponse message. Does not implicitly {@link google.spanner.executor.v1.CloudBackupResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudBackupResponse} message CloudBackupResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudBackupResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.listedBackups != null && message.listedBackups.length)
                                for (var i = 0; i < message.listedBackups.length; ++i)
                                    $root.google.spanner.admin.database.v1.Backup.encode(message.listedBackups[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.listedBackupOperations != null && message.listedBackupOperations.length)
                                for (var i = 0; i < message.listedBackupOperations.length; ++i)
                                    $root.google.longrunning.Operation.encode(message.listedBackupOperations[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.nextPageToken);
                            if (message.backup != null && Object.hasOwnProperty.call(message, "backup"))
                                $root.google.spanner.admin.database.v1.Backup.encode(message.backup, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CloudBackupResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CloudBackupResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudBackupResponse} message CloudBackupResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudBackupResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CloudBackupResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CloudBackupResponse} CloudBackupResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudBackupResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CloudBackupResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.listedBackups && message.listedBackups.length))
                                            message.listedBackups = [];
                                        message.listedBackups.push($root.google.spanner.admin.database.v1.Backup.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        if (!(message.listedBackupOperations && message.listedBackupOperations.length))
                                            message.listedBackupOperations = [];
                                        message.listedBackupOperations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        message.nextPageToken = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.backup = $root.google.spanner.admin.database.v1.Backup.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CloudBackupResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CloudBackupResponse} CloudBackupResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudBackupResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CloudBackupResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CloudBackupResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.listedBackups != null && message.hasOwnProperty("listedBackups")) {
                                if (!Array.isArray(message.listedBackups))
                                    return "listedBackups: array expected";
                                for (var i = 0; i < message.listedBackups.length; ++i) {
                                    var error = $root.google.spanner.admin.database.v1.Backup.verify(message.listedBackups[i]);
                                    if (error)
                                        return "listedBackups." + error;
                                }
                            }
                            if (message.listedBackupOperations != null && message.hasOwnProperty("listedBackupOperations")) {
                                if (!Array.isArray(message.listedBackupOperations))
                                    return "listedBackupOperations: array expected";
                                for (var i = 0; i < message.listedBackupOperations.length; ++i) {
                                    var error = $root.google.longrunning.Operation.verify(message.listedBackupOperations[i]);
                                    if (error)
                                        return "listedBackupOperations." + error;
                                }
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                if (!$util.isString(message.nextPageToken))
                                    return "nextPageToken: string expected";
                            if (message.backup != null && message.hasOwnProperty("backup")) {
                                var error = $root.google.spanner.admin.database.v1.Backup.verify(message.backup);
                                if (error)
                                    return "backup." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CloudBackupResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CloudBackupResponse} CloudBackupResponse
                         */
                        CloudBackupResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CloudBackupResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CloudBackupResponse();
                            if (object.listedBackups) {
                                if (!Array.isArray(object.listedBackups))
                                    throw TypeError(".google.spanner.executor.v1.CloudBackupResponse.listedBackups: array expected");
                                message.listedBackups = [];
                                for (var i = 0; i < object.listedBackups.length; ++i) {
                                    if (typeof object.listedBackups[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudBackupResponse.listedBackups: object expected");
                                    message.listedBackups[i] = $root.google.spanner.admin.database.v1.Backup.fromObject(object.listedBackups[i]);
                                }
                            }
                            if (object.listedBackupOperations) {
                                if (!Array.isArray(object.listedBackupOperations))
                                    throw TypeError(".google.spanner.executor.v1.CloudBackupResponse.listedBackupOperations: array expected");
                                message.listedBackupOperations = [];
                                for (var i = 0; i < object.listedBackupOperations.length; ++i) {
                                    if (typeof object.listedBackupOperations[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudBackupResponse.listedBackupOperations: object expected");
                                    message.listedBackupOperations[i] = $root.google.longrunning.Operation.fromObject(object.listedBackupOperations[i]);
                                }
                            }
                            if (object.nextPageToken != null)
                                message.nextPageToken = String(object.nextPageToken);
                            if (object.backup != null) {
                                if (typeof object.backup !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CloudBackupResponse.backup: object expected");
                                message.backup = $root.google.spanner.admin.database.v1.Backup.fromObject(object.backup);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CloudBackupResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {google.spanner.executor.v1.CloudBackupResponse} message CloudBackupResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CloudBackupResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.listedBackups = [];
                                object.listedBackupOperations = [];
                            }
                            if (options.defaults) {
                                object.nextPageToken = "";
                                object.backup = null;
                            }
                            if (message.listedBackups && message.listedBackups.length) {
                                object.listedBackups = [];
                                for (var j = 0; j < message.listedBackups.length; ++j)
                                    object.listedBackups[j] = $root.google.spanner.admin.database.v1.Backup.toObject(message.listedBackups[j], options);
                            }
                            if (message.listedBackupOperations && message.listedBackupOperations.length) {
                                object.listedBackupOperations = [];
                                for (var j = 0; j < message.listedBackupOperations.length; ++j)
                                    object.listedBackupOperations[j] = $root.google.longrunning.Operation.toObject(message.listedBackupOperations[j], options);
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                object.nextPageToken = message.nextPageToken;
                            if (message.backup != null && message.hasOwnProperty("backup"))
                                object.backup = $root.google.spanner.admin.database.v1.Backup.toObject(message.backup, options);
                            return object;
                        };
    
                        /**
                         * Converts this CloudBackupResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CloudBackupResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CloudBackupResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CloudBackupResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CloudBackupResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CloudBackupResponse";
                        };
    
                        return CloudBackupResponse;
                    })();
    
                    v1.OperationResponse = (function() {
    
                        /**
                         * Properties of an OperationResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface IOperationResponse
                         * @property {Array.<google.longrunning.IOperation>|null} [listedOperations] OperationResponse listedOperations
                         * @property {string|null} [nextPageToken] OperationResponse nextPageToken
                         * @property {google.longrunning.IOperation|null} [operation] OperationResponse operation
                         */
    
                        /**
                         * Constructs a new OperationResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents an OperationResponse.
                         * @implements IOperationResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.IOperationResponse=} [properties] Properties to set
                         */
                        function OperationResponse(properties) {
                            this.listedOperations = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * OperationResponse listedOperations.
                         * @member {Array.<google.longrunning.IOperation>} listedOperations
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @instance
                         */
                        OperationResponse.prototype.listedOperations = $util.emptyArray;
    
                        /**
                         * OperationResponse nextPageToken.
                         * @member {string} nextPageToken
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @instance
                         */
                        OperationResponse.prototype.nextPageToken = "";
    
                        /**
                         * OperationResponse operation.
                         * @member {google.longrunning.IOperation|null|undefined} operation
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @instance
                         */
                        OperationResponse.prototype.operation = null;
    
                        /**
                         * Creates a new OperationResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {google.spanner.executor.v1.IOperationResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.OperationResponse} OperationResponse instance
                         */
                        OperationResponse.create = function create(properties) {
                            return new OperationResponse(properties);
                        };
    
                        /**
                         * Encodes the specified OperationResponse message. Does not implicitly {@link google.spanner.executor.v1.OperationResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {google.spanner.executor.v1.IOperationResponse} message OperationResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        OperationResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.listedOperations != null && message.listedOperations.length)
                                for (var i = 0; i < message.listedOperations.length; ++i)
                                    $root.google.longrunning.Operation.encode(message.listedOperations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                            if (message.operation != null && Object.hasOwnProperty.call(message, "operation"))
                                $root.google.longrunning.Operation.encode(message.operation, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified OperationResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.OperationResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {google.spanner.executor.v1.IOperationResponse} message OperationResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        OperationResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an OperationResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.OperationResponse} OperationResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        OperationResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.OperationResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.listedOperations && message.listedOperations.length))
                                            message.listedOperations = [];
                                        message.listedOperations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        message.nextPageToken = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.operation = $root.google.longrunning.Operation.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an OperationResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.OperationResponse} OperationResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        OperationResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an OperationResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        OperationResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.listedOperations != null && message.hasOwnProperty("listedOperations")) {
                                if (!Array.isArray(message.listedOperations))
                                    return "listedOperations: array expected";
                                for (var i = 0; i < message.listedOperations.length; ++i) {
                                    var error = $root.google.longrunning.Operation.verify(message.listedOperations[i]);
                                    if (error)
                                        return "listedOperations." + error;
                                }
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                if (!$util.isString(message.nextPageToken))
                                    return "nextPageToken: string expected";
                            if (message.operation != null && message.hasOwnProperty("operation")) {
                                var error = $root.google.longrunning.Operation.verify(message.operation);
                                if (error)
                                    return "operation." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates an OperationResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.OperationResponse} OperationResponse
                         */
                        OperationResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.OperationResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.OperationResponse();
                            if (object.listedOperations) {
                                if (!Array.isArray(object.listedOperations))
                                    throw TypeError(".google.spanner.executor.v1.OperationResponse.listedOperations: array expected");
                                message.listedOperations = [];
                                for (var i = 0; i < object.listedOperations.length; ++i) {
                                    if (typeof object.listedOperations[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.OperationResponse.listedOperations: object expected");
                                    message.listedOperations[i] = $root.google.longrunning.Operation.fromObject(object.listedOperations[i]);
                                }
                            }
                            if (object.nextPageToken != null)
                                message.nextPageToken = String(object.nextPageToken);
                            if (object.operation != null) {
                                if (typeof object.operation !== "object")
                                    throw TypeError(".google.spanner.executor.v1.OperationResponse.operation: object expected");
                                message.operation = $root.google.longrunning.Operation.fromObject(object.operation);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an OperationResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {google.spanner.executor.v1.OperationResponse} message OperationResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        OperationResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.listedOperations = [];
                            if (options.defaults) {
                                object.nextPageToken = "";
                                object.operation = null;
                            }
                            if (message.listedOperations && message.listedOperations.length) {
                                object.listedOperations = [];
                                for (var j = 0; j < message.listedOperations.length; ++j)
                                    object.listedOperations[j] = $root.google.longrunning.Operation.toObject(message.listedOperations[j], options);
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                object.nextPageToken = message.nextPageToken;
                            if (message.operation != null && message.hasOwnProperty("operation"))
                                object.operation = $root.google.longrunning.Operation.toObject(message.operation, options);
                            return object;
                        };
    
                        /**
                         * Converts this OperationResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        OperationResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for OperationResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.OperationResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        OperationResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.OperationResponse";
                        };
    
                        return OperationResponse;
                    })();
    
                    v1.CloudInstanceResponse = (function() {
    
                        /**
                         * Properties of a CloudInstanceResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface ICloudInstanceResponse
                         * @property {Array.<google.spanner.admin.instance.v1.IInstance>|null} [listedInstances] CloudInstanceResponse listedInstances
                         * @property {string|null} [nextPageToken] CloudInstanceResponse nextPageToken
                         * @property {google.spanner.admin.instance.v1.IInstance|null} [instance] CloudInstanceResponse instance
                         */
    
                        /**
                         * Constructs a new CloudInstanceResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CloudInstanceResponse.
                         * @implements ICloudInstanceResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.ICloudInstanceResponse=} [properties] Properties to set
                         */
                        function CloudInstanceResponse(properties) {
                            this.listedInstances = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CloudInstanceResponse listedInstances.
                         * @member {Array.<google.spanner.admin.instance.v1.IInstance>} listedInstances
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @instance
                         */
                        CloudInstanceResponse.prototype.listedInstances = $util.emptyArray;
    
                        /**
                         * CloudInstanceResponse nextPageToken.
                         * @member {string} nextPageToken
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @instance
                         */
                        CloudInstanceResponse.prototype.nextPageToken = "";
    
                        /**
                         * CloudInstanceResponse instance.
                         * @member {google.spanner.admin.instance.v1.IInstance|null|undefined} instance
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @instance
                         */
                        CloudInstanceResponse.prototype.instance = null;
    
                        /**
                         * Creates a new CloudInstanceResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CloudInstanceResponse} CloudInstanceResponse instance
                         */
                        CloudInstanceResponse.create = function create(properties) {
                            return new CloudInstanceResponse(properties);
                        };
    
                        /**
                         * Encodes the specified CloudInstanceResponse message. Does not implicitly {@link google.spanner.executor.v1.CloudInstanceResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceResponse} message CloudInstanceResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudInstanceResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.listedInstances != null && message.listedInstances.length)
                                for (var i = 0; i < message.listedInstances.length; ++i)
                                    $root.google.spanner.admin.instance.v1.Instance.encode(message.listedInstances[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                            if (message.instance != null && Object.hasOwnProperty.call(message, "instance"))
                                $root.google.spanner.admin.instance.v1.Instance.encode(message.instance, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CloudInstanceResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CloudInstanceResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceResponse} message CloudInstanceResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudInstanceResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CloudInstanceResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CloudInstanceResponse} CloudInstanceResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudInstanceResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CloudInstanceResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.listedInstances && message.listedInstances.length))
                                            message.listedInstances = [];
                                        message.listedInstances.push($root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        message.nextPageToken = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.instance = $root.google.spanner.admin.instance.v1.Instance.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CloudInstanceResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CloudInstanceResponse} CloudInstanceResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudInstanceResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CloudInstanceResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CloudInstanceResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.listedInstances != null && message.hasOwnProperty("listedInstances")) {
                                if (!Array.isArray(message.listedInstances))
                                    return "listedInstances: array expected";
                                for (var i = 0; i < message.listedInstances.length; ++i) {
                                    var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.listedInstances[i]);
                                    if (error)
                                        return "listedInstances." + error;
                                }
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                if (!$util.isString(message.nextPageToken))
                                    return "nextPageToken: string expected";
                            if (message.instance != null && message.hasOwnProperty("instance")) {
                                var error = $root.google.spanner.admin.instance.v1.Instance.verify(message.instance);
                                if (error)
                                    return "instance." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CloudInstanceResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CloudInstanceResponse} CloudInstanceResponse
                         */
                        CloudInstanceResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CloudInstanceResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CloudInstanceResponse();
                            if (object.listedInstances) {
                                if (!Array.isArray(object.listedInstances))
                                    throw TypeError(".google.spanner.executor.v1.CloudInstanceResponse.listedInstances: array expected");
                                message.listedInstances = [];
                                for (var i = 0; i < object.listedInstances.length; ++i) {
                                    if (typeof object.listedInstances[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudInstanceResponse.listedInstances: object expected");
                                    message.listedInstances[i] = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.listedInstances[i]);
                                }
                            }
                            if (object.nextPageToken != null)
                                message.nextPageToken = String(object.nextPageToken);
                            if (object.instance != null) {
                                if (typeof object.instance !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CloudInstanceResponse.instance: object expected");
                                message.instance = $root.google.spanner.admin.instance.v1.Instance.fromObject(object.instance);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CloudInstanceResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {google.spanner.executor.v1.CloudInstanceResponse} message CloudInstanceResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CloudInstanceResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.listedInstances = [];
                            if (options.defaults) {
                                object.nextPageToken = "";
                                object.instance = null;
                            }
                            if (message.listedInstances && message.listedInstances.length) {
                                object.listedInstances = [];
                                for (var j = 0; j < message.listedInstances.length; ++j)
                                    object.listedInstances[j] = $root.google.spanner.admin.instance.v1.Instance.toObject(message.listedInstances[j], options);
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                object.nextPageToken = message.nextPageToken;
                            if (message.instance != null && message.hasOwnProperty("instance"))
                                object.instance = $root.google.spanner.admin.instance.v1.Instance.toObject(message.instance, options);
                            return object;
                        };
    
                        /**
                         * Converts this CloudInstanceResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CloudInstanceResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CloudInstanceResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CloudInstanceResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CloudInstanceResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CloudInstanceResponse";
                        };
    
                        return CloudInstanceResponse;
                    })();
    
                    v1.CloudInstanceConfigResponse = (function() {
    
                        /**
                         * Properties of a CloudInstanceConfigResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface ICloudInstanceConfigResponse
                         * @property {Array.<google.spanner.admin.instance.v1.IInstanceConfig>|null} [listedInstanceConfigs] CloudInstanceConfigResponse listedInstanceConfigs
                         * @property {string|null} [nextPageToken] CloudInstanceConfigResponse nextPageToken
                         * @property {google.spanner.admin.instance.v1.IInstanceConfig|null} [instanceConfig] CloudInstanceConfigResponse instanceConfig
                         */
    
                        /**
                         * Constructs a new CloudInstanceConfigResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CloudInstanceConfigResponse.
                         * @implements ICloudInstanceConfigResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.ICloudInstanceConfigResponse=} [properties] Properties to set
                         */
                        function CloudInstanceConfigResponse(properties) {
                            this.listedInstanceConfigs = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CloudInstanceConfigResponse listedInstanceConfigs.
                         * @member {Array.<google.spanner.admin.instance.v1.IInstanceConfig>} listedInstanceConfigs
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @instance
                         */
                        CloudInstanceConfigResponse.prototype.listedInstanceConfigs = $util.emptyArray;
    
                        /**
                         * CloudInstanceConfigResponse nextPageToken.
                         * @member {string} nextPageToken
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @instance
                         */
                        CloudInstanceConfigResponse.prototype.nextPageToken = "";
    
                        /**
                         * CloudInstanceConfigResponse instanceConfig.
                         * @member {google.spanner.admin.instance.v1.IInstanceConfig|null|undefined} instanceConfig
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @instance
                         */
                        CloudInstanceConfigResponse.prototype.instanceConfig = null;
    
                        /**
                         * Creates a new CloudInstanceConfigResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceConfigResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CloudInstanceConfigResponse} CloudInstanceConfigResponse instance
                         */
                        CloudInstanceConfigResponse.create = function create(properties) {
                            return new CloudInstanceConfigResponse(properties);
                        };
    
                        /**
                         * Encodes the specified CloudInstanceConfigResponse message. Does not implicitly {@link google.spanner.executor.v1.CloudInstanceConfigResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceConfigResponse} message CloudInstanceConfigResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudInstanceConfigResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.listedInstanceConfigs != null && message.listedInstanceConfigs.length)
                                for (var i = 0; i < message.listedInstanceConfigs.length; ++i)
                                    $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.listedInstanceConfigs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                            if (message.instanceConfig != null && Object.hasOwnProperty.call(message, "instanceConfig"))
                                $root.google.spanner.admin.instance.v1.InstanceConfig.encode(message.instanceConfig, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CloudInstanceConfigResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CloudInstanceConfigResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudInstanceConfigResponse} message CloudInstanceConfigResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudInstanceConfigResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CloudInstanceConfigResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CloudInstanceConfigResponse} CloudInstanceConfigResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudInstanceConfigResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CloudInstanceConfigResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.listedInstanceConfigs && message.listedInstanceConfigs.length))
                                            message.listedInstanceConfigs = [];
                                        message.listedInstanceConfigs.push($root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        message.nextPageToken = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CloudInstanceConfigResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CloudInstanceConfigResponse} CloudInstanceConfigResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudInstanceConfigResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CloudInstanceConfigResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CloudInstanceConfigResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.listedInstanceConfigs != null && message.hasOwnProperty("listedInstanceConfigs")) {
                                if (!Array.isArray(message.listedInstanceConfigs))
                                    return "listedInstanceConfigs: array expected";
                                for (var i = 0; i < message.listedInstanceConfigs.length; ++i) {
                                    var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.listedInstanceConfigs[i]);
                                    if (error)
                                        return "listedInstanceConfigs." + error;
                                }
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                if (!$util.isString(message.nextPageToken))
                                    return "nextPageToken: string expected";
                            if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig")) {
                                var error = $root.google.spanner.admin.instance.v1.InstanceConfig.verify(message.instanceConfig);
                                if (error)
                                    return "instanceConfig." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CloudInstanceConfigResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CloudInstanceConfigResponse} CloudInstanceConfigResponse
                         */
                        CloudInstanceConfigResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CloudInstanceConfigResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CloudInstanceConfigResponse();
                            if (object.listedInstanceConfigs) {
                                if (!Array.isArray(object.listedInstanceConfigs))
                                    throw TypeError(".google.spanner.executor.v1.CloudInstanceConfigResponse.listedInstanceConfigs: array expected");
                                message.listedInstanceConfigs = [];
                                for (var i = 0; i < object.listedInstanceConfigs.length; ++i) {
                                    if (typeof object.listedInstanceConfigs[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudInstanceConfigResponse.listedInstanceConfigs: object expected");
                                    message.listedInstanceConfigs[i] = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.listedInstanceConfigs[i]);
                                }
                            }
                            if (object.nextPageToken != null)
                                message.nextPageToken = String(object.nextPageToken);
                            if (object.instanceConfig != null) {
                                if (typeof object.instanceConfig !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CloudInstanceConfigResponse.instanceConfig: object expected");
                                message.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.fromObject(object.instanceConfig);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CloudInstanceConfigResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {google.spanner.executor.v1.CloudInstanceConfigResponse} message CloudInstanceConfigResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CloudInstanceConfigResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.listedInstanceConfigs = [];
                            if (options.defaults) {
                                object.nextPageToken = "";
                                object.instanceConfig = null;
                            }
                            if (message.listedInstanceConfigs && message.listedInstanceConfigs.length) {
                                object.listedInstanceConfigs = [];
                                for (var j = 0; j < message.listedInstanceConfigs.length; ++j)
                                    object.listedInstanceConfigs[j] = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.listedInstanceConfigs[j], options);
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                object.nextPageToken = message.nextPageToken;
                            if (message.instanceConfig != null && message.hasOwnProperty("instanceConfig"))
                                object.instanceConfig = $root.google.spanner.admin.instance.v1.InstanceConfig.toObject(message.instanceConfig, options);
                            return object;
                        };
    
                        /**
                         * Converts this CloudInstanceConfigResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CloudInstanceConfigResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CloudInstanceConfigResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CloudInstanceConfigResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CloudInstanceConfigResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CloudInstanceConfigResponse";
                        };
    
                        return CloudInstanceConfigResponse;
                    })();
    
                    v1.CloudDatabaseResponse = (function() {
    
                        /**
                         * Properties of a CloudDatabaseResponse.
                         * @memberof google.spanner.executor.v1
                         * @interface ICloudDatabaseResponse
                         * @property {Array.<google.spanner.admin.database.v1.IDatabase>|null} [listedDatabases] CloudDatabaseResponse listedDatabases
                         * @property {Array.<google.longrunning.IOperation>|null} [listedDatabaseOperations] CloudDatabaseResponse listedDatabaseOperations
                         * @property {string|null} [nextPageToken] CloudDatabaseResponse nextPageToken
                         * @property {google.spanner.admin.database.v1.IDatabase|null} [database] CloudDatabaseResponse database
                         */
    
                        /**
                         * Constructs a new CloudDatabaseResponse.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a CloudDatabaseResponse.
                         * @implements ICloudDatabaseResponse
                         * @constructor
                         * @param {google.spanner.executor.v1.ICloudDatabaseResponse=} [properties] Properties to set
                         */
                        function CloudDatabaseResponse(properties) {
                            this.listedDatabases = [];
                            this.listedDatabaseOperations = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CloudDatabaseResponse listedDatabases.
                         * @member {Array.<google.spanner.admin.database.v1.IDatabase>} listedDatabases
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @instance
                         */
                        CloudDatabaseResponse.prototype.listedDatabases = $util.emptyArray;
    
                        /**
                         * CloudDatabaseResponse listedDatabaseOperations.
                         * @member {Array.<google.longrunning.IOperation>} listedDatabaseOperations
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @instance
                         */
                        CloudDatabaseResponse.prototype.listedDatabaseOperations = $util.emptyArray;
    
                        /**
                         * CloudDatabaseResponse nextPageToken.
                         * @member {string} nextPageToken
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @instance
                         */
                        CloudDatabaseResponse.prototype.nextPageToken = "";
    
                        /**
                         * CloudDatabaseResponse database.
                         * @member {google.spanner.admin.database.v1.IDatabase|null|undefined} database
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @instance
                         */
                        CloudDatabaseResponse.prototype.database = null;
    
                        /**
                         * Creates a new CloudDatabaseResponse instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudDatabaseResponse=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.CloudDatabaseResponse} CloudDatabaseResponse instance
                         */
                        CloudDatabaseResponse.create = function create(properties) {
                            return new CloudDatabaseResponse(properties);
                        };
    
                        /**
                         * Encodes the specified CloudDatabaseResponse message. Does not implicitly {@link google.spanner.executor.v1.CloudDatabaseResponse.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudDatabaseResponse} message CloudDatabaseResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudDatabaseResponse.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.listedDatabases != null && message.listedDatabases.length)
                                for (var i = 0; i < message.listedDatabases.length; ++i)
                                    $root.google.spanner.admin.database.v1.Database.encode(message.listedDatabases[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.listedDatabaseOperations != null && message.listedDatabaseOperations.length)
                                for (var i = 0; i < message.listedDatabaseOperations.length; ++i)
                                    $root.google.longrunning.Operation.encode(message.listedDatabaseOperations[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.nextPageToken);
                            if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                                $root.google.spanner.admin.database.v1.Database.encode(message.database, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CloudDatabaseResponse message, length delimited. Does not implicitly {@link google.spanner.executor.v1.CloudDatabaseResponse.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {google.spanner.executor.v1.ICloudDatabaseResponse} message CloudDatabaseResponse message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CloudDatabaseResponse.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CloudDatabaseResponse message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.CloudDatabaseResponse} CloudDatabaseResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudDatabaseResponse.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.CloudDatabaseResponse();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.listedDatabases && message.listedDatabases.length))
                                            message.listedDatabases = [];
                                        message.listedDatabases.push($root.google.spanner.admin.database.v1.Database.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        if (!(message.listedDatabaseOperations && message.listedDatabaseOperations.length))
                                            message.listedDatabaseOperations = [];
                                        message.listedDatabaseOperations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 3: {
                                        message.nextPageToken = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.database = $root.google.spanner.admin.database.v1.Database.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CloudDatabaseResponse message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.CloudDatabaseResponse} CloudDatabaseResponse
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CloudDatabaseResponse.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CloudDatabaseResponse message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CloudDatabaseResponse.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.listedDatabases != null && message.hasOwnProperty("listedDatabases")) {
                                if (!Array.isArray(message.listedDatabases))
                                    return "listedDatabases: array expected";
                                for (var i = 0; i < message.listedDatabases.length; ++i) {
                                    var error = $root.google.spanner.admin.database.v1.Database.verify(message.listedDatabases[i]);
                                    if (error)
                                        return "listedDatabases." + error;
                                }
                            }
                            if (message.listedDatabaseOperations != null && message.hasOwnProperty("listedDatabaseOperations")) {
                                if (!Array.isArray(message.listedDatabaseOperations))
                                    return "listedDatabaseOperations: array expected";
                                for (var i = 0; i < message.listedDatabaseOperations.length; ++i) {
                                    var error = $root.google.longrunning.Operation.verify(message.listedDatabaseOperations[i]);
                                    if (error)
                                        return "listedDatabaseOperations." + error;
                                }
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                if (!$util.isString(message.nextPageToken))
                                    return "nextPageToken: string expected";
                            if (message.database != null && message.hasOwnProperty("database")) {
                                var error = $root.google.spanner.admin.database.v1.Database.verify(message.database);
                                if (error)
                                    return "database." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a CloudDatabaseResponse message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.CloudDatabaseResponse} CloudDatabaseResponse
                         */
                        CloudDatabaseResponse.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.CloudDatabaseResponse)
                                return object;
                            var message = new $root.google.spanner.executor.v1.CloudDatabaseResponse();
                            if (object.listedDatabases) {
                                if (!Array.isArray(object.listedDatabases))
                                    throw TypeError(".google.spanner.executor.v1.CloudDatabaseResponse.listedDatabases: array expected");
                                message.listedDatabases = [];
                                for (var i = 0; i < object.listedDatabases.length; ++i) {
                                    if (typeof object.listedDatabases[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudDatabaseResponse.listedDatabases: object expected");
                                    message.listedDatabases[i] = $root.google.spanner.admin.database.v1.Database.fromObject(object.listedDatabases[i]);
                                }
                            }
                            if (object.listedDatabaseOperations) {
                                if (!Array.isArray(object.listedDatabaseOperations))
                                    throw TypeError(".google.spanner.executor.v1.CloudDatabaseResponse.listedDatabaseOperations: array expected");
                                message.listedDatabaseOperations = [];
                                for (var i = 0; i < object.listedDatabaseOperations.length; ++i) {
                                    if (typeof object.listedDatabaseOperations[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.CloudDatabaseResponse.listedDatabaseOperations: object expected");
                                    message.listedDatabaseOperations[i] = $root.google.longrunning.Operation.fromObject(object.listedDatabaseOperations[i]);
                                }
                            }
                            if (object.nextPageToken != null)
                                message.nextPageToken = String(object.nextPageToken);
                            if (object.database != null) {
                                if (typeof object.database !== "object")
                                    throw TypeError(".google.spanner.executor.v1.CloudDatabaseResponse.database: object expected");
                                message.database = $root.google.spanner.admin.database.v1.Database.fromObject(object.database);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CloudDatabaseResponse message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {google.spanner.executor.v1.CloudDatabaseResponse} message CloudDatabaseResponse
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CloudDatabaseResponse.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.listedDatabases = [];
                                object.listedDatabaseOperations = [];
                            }
                            if (options.defaults) {
                                object.nextPageToken = "";
                                object.database = null;
                            }
                            if (message.listedDatabases && message.listedDatabases.length) {
                                object.listedDatabases = [];
                                for (var j = 0; j < message.listedDatabases.length; ++j)
                                    object.listedDatabases[j] = $root.google.spanner.admin.database.v1.Database.toObject(message.listedDatabases[j], options);
                            }
                            if (message.listedDatabaseOperations && message.listedDatabaseOperations.length) {
                                object.listedDatabaseOperations = [];
                                for (var j = 0; j < message.listedDatabaseOperations.length; ++j)
                                    object.listedDatabaseOperations[j] = $root.google.longrunning.Operation.toObject(message.listedDatabaseOperations[j], options);
                            }
                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                                object.nextPageToken = message.nextPageToken;
                            if (message.database != null && message.hasOwnProperty("database"))
                                object.database = $root.google.spanner.admin.database.v1.Database.toObject(message.database, options);
                            return object;
                        };
    
                        /**
                         * Converts this CloudDatabaseResponse to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CloudDatabaseResponse.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CloudDatabaseResponse
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.CloudDatabaseResponse
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CloudDatabaseResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.CloudDatabaseResponse";
                        };
    
                        return CloudDatabaseResponse;
                    })();
    
                    v1.ReadResult = (function() {
    
                        /**
                         * Properties of a ReadResult.
                         * @memberof google.spanner.executor.v1
                         * @interface IReadResult
                         * @property {string|null} [table] ReadResult table
                         * @property {string|null} [index] ReadResult index
                         * @property {number|null} [requestIndex] ReadResult requestIndex
                         * @property {Array.<google.spanner.executor.v1.IValueList>|null} [row] ReadResult row
                         * @property {google.spanner.v1.IStructType|null} [rowType] ReadResult rowType
                         */
    
                        /**
                         * Constructs a new ReadResult.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ReadResult.
                         * @implements IReadResult
                         * @constructor
                         * @param {google.spanner.executor.v1.IReadResult=} [properties] Properties to set
                         */
                        function ReadResult(properties) {
                            this.row = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ReadResult table.
                         * @member {string} table
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         */
                        ReadResult.prototype.table = "";
    
                        /**
                         * ReadResult index.
                         * @member {string|null|undefined} index
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         */
                        ReadResult.prototype.index = null;
    
                        /**
                         * ReadResult requestIndex.
                         * @member {number|null|undefined} requestIndex
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         */
                        ReadResult.prototype.requestIndex = null;
    
                        /**
                         * ReadResult row.
                         * @member {Array.<google.spanner.executor.v1.IValueList>} row
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         */
                        ReadResult.prototype.row = $util.emptyArray;
    
                        /**
                         * ReadResult rowType.
                         * @member {google.spanner.v1.IStructType|null|undefined} rowType
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         */
                        ReadResult.prototype.rowType = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ReadResult.prototype, "_index", {
                            get: $util.oneOfGetter($oneOfFields = ["index"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ReadResult.prototype, "_requestIndex", {
                            get: $util.oneOfGetter($oneOfFields = ["requestIndex"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(ReadResult.prototype, "_rowType", {
                            get: $util.oneOfGetter($oneOfFields = ["rowType"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ReadResult instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {google.spanner.executor.v1.IReadResult=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ReadResult} ReadResult instance
                         */
                        ReadResult.create = function create(properties) {
                            return new ReadResult(properties);
                        };
    
                        /**
                         * Encodes the specified ReadResult message. Does not implicitly {@link google.spanner.executor.v1.ReadResult.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {google.spanner.executor.v1.IReadResult} message ReadResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadResult.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                            if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.index);
                            if (message.requestIndex != null && Object.hasOwnProperty.call(message, "requestIndex"))
                                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.requestIndex);
                            if (message.row != null && message.row.length)
                                for (var i = 0; i < message.row.length; ++i)
                                    $root.google.spanner.executor.v1.ValueList.encode(message.row[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.rowType != null && Object.hasOwnProperty.call(message, "rowType"))
                                $root.google.spanner.v1.StructType.encode(message.rowType, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ReadResult message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ReadResult.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {google.spanner.executor.v1.IReadResult} message ReadResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadResult.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ReadResult message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ReadResult} ReadResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadResult.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ReadResult();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.index = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.requestIndex = reader.int32();
                                        break;
                                    }
                                case 4: {
                                        if (!(message.row && message.row.length))
                                            message.row = [];
                                        message.row.push($root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 5: {
                                        message.rowType = $root.google.spanner.v1.StructType.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ReadResult message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ReadResult} ReadResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadResult.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ReadResult message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ReadResult.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.index != null && message.hasOwnProperty("index")) {
                                properties._index = 1;
                                if (!$util.isString(message.index))
                                    return "index: string expected";
                            }
                            if (message.requestIndex != null && message.hasOwnProperty("requestIndex")) {
                                properties._requestIndex = 1;
                                if (!$util.isInteger(message.requestIndex))
                                    return "requestIndex: integer expected";
                            }
                            if (message.row != null && message.hasOwnProperty("row")) {
                                if (!Array.isArray(message.row))
                                    return "row: array expected";
                                for (var i = 0; i < message.row.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ValueList.verify(message.row[i]);
                                    if (error)
                                        return "row." + error;
                                }
                            }
                            if (message.rowType != null && message.hasOwnProperty("rowType")) {
                                properties._rowType = 1;
                                {
                                    var error = $root.google.spanner.v1.StructType.verify(message.rowType);
                                    if (error)
                                        return "rowType." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ReadResult message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ReadResult} ReadResult
                         */
                        ReadResult.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ReadResult)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ReadResult();
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.index != null)
                                message.index = String(object.index);
                            if (object.requestIndex != null)
                                message.requestIndex = object.requestIndex | 0;
                            if (object.row) {
                                if (!Array.isArray(object.row))
                                    throw TypeError(".google.spanner.executor.v1.ReadResult.row: array expected");
                                message.row = [];
                                for (var i = 0; i < object.row.length; ++i) {
                                    if (typeof object.row[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.ReadResult.row: object expected");
                                    message.row[i] = $root.google.spanner.executor.v1.ValueList.fromObject(object.row[i]);
                                }
                            }
                            if (object.rowType != null) {
                                if (typeof object.rowType !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ReadResult.rowType: object expected");
                                message.rowType = $root.google.spanner.v1.StructType.fromObject(object.rowType);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ReadResult message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {google.spanner.executor.v1.ReadResult} message ReadResult
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ReadResult.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.row = [];
                            if (options.defaults)
                                object.table = "";
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.index != null && message.hasOwnProperty("index")) {
                                object.index = message.index;
                                if (options.oneofs)
                                    object._index = "index";
                            }
                            if (message.requestIndex != null && message.hasOwnProperty("requestIndex")) {
                                object.requestIndex = message.requestIndex;
                                if (options.oneofs)
                                    object._requestIndex = "requestIndex";
                            }
                            if (message.row && message.row.length) {
                                object.row = [];
                                for (var j = 0; j < message.row.length; ++j)
                                    object.row[j] = $root.google.spanner.executor.v1.ValueList.toObject(message.row[j], options);
                            }
                            if (message.rowType != null && message.hasOwnProperty("rowType")) {
                                object.rowType = $root.google.spanner.v1.StructType.toObject(message.rowType, options);
                                if (options.oneofs)
                                    object._rowType = "rowType";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ReadResult to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ReadResult.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ReadResult
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ReadResult
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ReadResult.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ReadResult";
                        };
    
                        return ReadResult;
                    })();
    
                    v1.QueryResult = (function() {
    
                        /**
                         * Properties of a QueryResult.
                         * @memberof google.spanner.executor.v1
                         * @interface IQueryResult
                         * @property {Array.<google.spanner.executor.v1.IValueList>|null} [row] QueryResult row
                         * @property {google.spanner.v1.IStructType|null} [rowType] QueryResult rowType
                         */
    
                        /**
                         * Constructs a new QueryResult.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a QueryResult.
                         * @implements IQueryResult
                         * @constructor
                         * @param {google.spanner.executor.v1.IQueryResult=} [properties] Properties to set
                         */
                        function QueryResult(properties) {
                            this.row = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * QueryResult row.
                         * @member {Array.<google.spanner.executor.v1.IValueList>} row
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @instance
                         */
                        QueryResult.prototype.row = $util.emptyArray;
    
                        /**
                         * QueryResult rowType.
                         * @member {google.spanner.v1.IStructType|null|undefined} rowType
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @instance
                         */
                        QueryResult.prototype.rowType = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        // Virtual OneOf for proto3 optional field
                        Object.defineProperty(QueryResult.prototype, "_rowType", {
                            get: $util.oneOfGetter($oneOfFields = ["rowType"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new QueryResult instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {google.spanner.executor.v1.IQueryResult=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.QueryResult} QueryResult instance
                         */
                        QueryResult.create = function create(properties) {
                            return new QueryResult(properties);
                        };
    
                        /**
                         * Encodes the specified QueryResult message. Does not implicitly {@link google.spanner.executor.v1.QueryResult.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {google.spanner.executor.v1.IQueryResult} message QueryResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryResult.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.row != null && message.row.length)
                                for (var i = 0; i < message.row.length; ++i)
                                    $root.google.spanner.executor.v1.ValueList.encode(message.row[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.rowType != null && Object.hasOwnProperty.call(message, "rowType"))
                                $root.google.spanner.v1.StructType.encode(message.rowType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified QueryResult message, length delimited. Does not implicitly {@link google.spanner.executor.v1.QueryResult.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {google.spanner.executor.v1.IQueryResult} message QueryResult message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryResult.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a QueryResult message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.QueryResult} QueryResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryResult.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.QueryResult();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.row && message.row.length))
                                            message.row = [];
                                        message.row.push($root.google.spanner.executor.v1.ValueList.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        message.rowType = $root.google.spanner.v1.StructType.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a QueryResult message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.QueryResult} QueryResult
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryResult.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a QueryResult message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        QueryResult.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.row != null && message.hasOwnProperty("row")) {
                                if (!Array.isArray(message.row))
                                    return "row: array expected";
                                for (var i = 0; i < message.row.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ValueList.verify(message.row[i]);
                                    if (error)
                                        return "row." + error;
                                }
                            }
                            if (message.rowType != null && message.hasOwnProperty("rowType")) {
                                properties._rowType = 1;
                                {
                                    var error = $root.google.spanner.v1.StructType.verify(message.rowType);
                                    if (error)
                                        return "rowType." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a QueryResult message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.QueryResult} QueryResult
                         */
                        QueryResult.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.QueryResult)
                                return object;
                            var message = new $root.google.spanner.executor.v1.QueryResult();
                            if (object.row) {
                                if (!Array.isArray(object.row))
                                    throw TypeError(".google.spanner.executor.v1.QueryResult.row: array expected");
                                message.row = [];
                                for (var i = 0; i < object.row.length; ++i) {
                                    if (typeof object.row[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.QueryResult.row: object expected");
                                    message.row[i] = $root.google.spanner.executor.v1.ValueList.fromObject(object.row[i]);
                                }
                            }
                            if (object.rowType != null) {
                                if (typeof object.rowType !== "object")
                                    throw TypeError(".google.spanner.executor.v1.QueryResult.rowType: object expected");
                                message.rowType = $root.google.spanner.v1.StructType.fromObject(object.rowType);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a QueryResult message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {google.spanner.executor.v1.QueryResult} message QueryResult
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        QueryResult.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.row = [];
                            if (message.row && message.row.length) {
                                object.row = [];
                                for (var j = 0; j < message.row.length; ++j)
                                    object.row[j] = $root.google.spanner.executor.v1.ValueList.toObject(message.row[j], options);
                            }
                            if (message.rowType != null && message.hasOwnProperty("rowType")) {
                                object.rowType = $root.google.spanner.v1.StructType.toObject(message.rowType, options);
                                if (options.oneofs)
                                    object._rowType = "rowType";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this QueryResult to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        QueryResult.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for QueryResult
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.QueryResult
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        QueryResult.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.QueryResult";
                        };
    
                        return QueryResult;
                    })();
    
                    v1.ChangeStreamRecord = (function() {
    
                        /**
                         * Properties of a ChangeStreamRecord.
                         * @memberof google.spanner.executor.v1
                         * @interface IChangeStreamRecord
                         * @property {google.spanner.executor.v1.IDataChangeRecord|null} [dataChange] ChangeStreamRecord dataChange
                         * @property {google.spanner.executor.v1.IChildPartitionsRecord|null} [childPartition] ChangeStreamRecord childPartition
                         * @property {google.spanner.executor.v1.IHeartbeatRecord|null} [heartbeat] ChangeStreamRecord heartbeat
                         */
    
                        /**
                         * Constructs a new ChangeStreamRecord.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ChangeStreamRecord.
                         * @implements IChangeStreamRecord
                         * @constructor
                         * @param {google.spanner.executor.v1.IChangeStreamRecord=} [properties] Properties to set
                         */
                        function ChangeStreamRecord(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ChangeStreamRecord dataChange.
                         * @member {google.spanner.executor.v1.IDataChangeRecord|null|undefined} dataChange
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @instance
                         */
                        ChangeStreamRecord.prototype.dataChange = null;
    
                        /**
                         * ChangeStreamRecord childPartition.
                         * @member {google.spanner.executor.v1.IChildPartitionsRecord|null|undefined} childPartition
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @instance
                         */
                        ChangeStreamRecord.prototype.childPartition = null;
    
                        /**
                         * ChangeStreamRecord heartbeat.
                         * @member {google.spanner.executor.v1.IHeartbeatRecord|null|undefined} heartbeat
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @instance
                         */
                        ChangeStreamRecord.prototype.heartbeat = null;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * ChangeStreamRecord record.
                         * @member {"dataChange"|"childPartition"|"heartbeat"|undefined} record
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @instance
                         */
                        Object.defineProperty(ChangeStreamRecord.prototype, "record", {
                            get: $util.oneOfGetter($oneOfFields = ["dataChange", "childPartition", "heartbeat"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ChangeStreamRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChangeStreamRecord=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ChangeStreamRecord} ChangeStreamRecord instance
                         */
                        ChangeStreamRecord.create = function create(properties) {
                            return new ChangeStreamRecord(properties);
                        };
    
                        /**
                         * Encodes the specified ChangeStreamRecord message. Does not implicitly {@link google.spanner.executor.v1.ChangeStreamRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChangeStreamRecord} message ChangeStreamRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChangeStreamRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.dataChange != null && Object.hasOwnProperty.call(message, "dataChange"))
                                $root.google.spanner.executor.v1.DataChangeRecord.encode(message.dataChange, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.childPartition != null && Object.hasOwnProperty.call(message, "childPartition"))
                                $root.google.spanner.executor.v1.ChildPartitionsRecord.encode(message.childPartition, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.heartbeat != null && Object.hasOwnProperty.call(message, "heartbeat"))
                                $root.google.spanner.executor.v1.HeartbeatRecord.encode(message.heartbeat, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ChangeStreamRecord message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ChangeStreamRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChangeStreamRecord} message ChangeStreamRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChangeStreamRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ChangeStreamRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ChangeStreamRecord} ChangeStreamRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChangeStreamRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ChangeStreamRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.dataChange = $root.google.spanner.executor.v1.DataChangeRecord.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.childPartition = $root.google.spanner.executor.v1.ChildPartitionsRecord.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.heartbeat = $root.google.spanner.executor.v1.HeartbeatRecord.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ChangeStreamRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ChangeStreamRecord} ChangeStreamRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChangeStreamRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ChangeStreamRecord message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ChangeStreamRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.dataChange != null && message.hasOwnProperty("dataChange")) {
                                properties.record = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.DataChangeRecord.verify(message.dataChange);
                                    if (error)
                                        return "dataChange." + error;
                                }
                            }
                            if (message.childPartition != null && message.hasOwnProperty("childPartition")) {
                                if (properties.record === 1)
                                    return "record: multiple values";
                                properties.record = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.ChildPartitionsRecord.verify(message.childPartition);
                                    if (error)
                                        return "childPartition." + error;
                                }
                            }
                            if (message.heartbeat != null && message.hasOwnProperty("heartbeat")) {
                                if (properties.record === 1)
                                    return "record: multiple values";
                                properties.record = 1;
                                {
                                    var error = $root.google.spanner.executor.v1.HeartbeatRecord.verify(message.heartbeat);
                                    if (error)
                                        return "heartbeat." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ChangeStreamRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ChangeStreamRecord} ChangeStreamRecord
                         */
                        ChangeStreamRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ChangeStreamRecord)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ChangeStreamRecord();
                            if (object.dataChange != null) {
                                if (typeof object.dataChange !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ChangeStreamRecord.dataChange: object expected");
                                message.dataChange = $root.google.spanner.executor.v1.DataChangeRecord.fromObject(object.dataChange);
                            }
                            if (object.childPartition != null) {
                                if (typeof object.childPartition !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ChangeStreamRecord.childPartition: object expected");
                                message.childPartition = $root.google.spanner.executor.v1.ChildPartitionsRecord.fromObject(object.childPartition);
                            }
                            if (object.heartbeat != null) {
                                if (typeof object.heartbeat !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ChangeStreamRecord.heartbeat: object expected");
                                message.heartbeat = $root.google.spanner.executor.v1.HeartbeatRecord.fromObject(object.heartbeat);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ChangeStreamRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {google.spanner.executor.v1.ChangeStreamRecord} message ChangeStreamRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ChangeStreamRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (message.dataChange != null && message.hasOwnProperty("dataChange")) {
                                object.dataChange = $root.google.spanner.executor.v1.DataChangeRecord.toObject(message.dataChange, options);
                                if (options.oneofs)
                                    object.record = "dataChange";
                            }
                            if (message.childPartition != null && message.hasOwnProperty("childPartition")) {
                                object.childPartition = $root.google.spanner.executor.v1.ChildPartitionsRecord.toObject(message.childPartition, options);
                                if (options.oneofs)
                                    object.record = "childPartition";
                            }
                            if (message.heartbeat != null && message.hasOwnProperty("heartbeat")) {
                                object.heartbeat = $root.google.spanner.executor.v1.HeartbeatRecord.toObject(message.heartbeat, options);
                                if (options.oneofs)
                                    object.record = "heartbeat";
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ChangeStreamRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ChangeStreamRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ChangeStreamRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ChangeStreamRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ChangeStreamRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ChangeStreamRecord";
                        };
    
                        return ChangeStreamRecord;
                    })();
    
                    v1.DataChangeRecord = (function() {
    
                        /**
                         * Properties of a DataChangeRecord.
                         * @memberof google.spanner.executor.v1
                         * @interface IDataChangeRecord
                         * @property {google.protobuf.ITimestamp|null} [commitTime] DataChangeRecord commitTime
                         * @property {string|null} [recordSequence] DataChangeRecord recordSequence
                         * @property {string|null} [transactionId] DataChangeRecord transactionId
                         * @property {boolean|null} [isLastRecord] DataChangeRecord isLastRecord
                         * @property {string|null} [table] DataChangeRecord table
                         * @property {Array.<google.spanner.executor.v1.DataChangeRecord.IColumnType>|null} [columnTypes] DataChangeRecord columnTypes
                         * @property {Array.<google.spanner.executor.v1.DataChangeRecord.IMod>|null} [mods] DataChangeRecord mods
                         * @property {string|null} [modType] DataChangeRecord modType
                         * @property {string|null} [valueCaptureType] DataChangeRecord valueCaptureType
                         * @property {number|Long|null} [recordCount] DataChangeRecord recordCount
                         * @property {number|Long|null} [partitionCount] DataChangeRecord partitionCount
                         * @property {string|null} [transactionTag] DataChangeRecord transactionTag
                         * @property {boolean|null} [isSystemTransaction] DataChangeRecord isSystemTransaction
                         */
    
                        /**
                         * Constructs a new DataChangeRecord.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a DataChangeRecord.
                         * @implements IDataChangeRecord
                         * @constructor
                         * @param {google.spanner.executor.v1.IDataChangeRecord=} [properties] Properties to set
                         */
                        function DataChangeRecord(properties) {
                            this.columnTypes = [];
                            this.mods = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DataChangeRecord commitTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} commitTime
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.commitTime = null;
    
                        /**
                         * DataChangeRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.recordSequence = "";
    
                        /**
                         * DataChangeRecord transactionId.
                         * @member {string} transactionId
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.transactionId = "";
    
                        /**
                         * DataChangeRecord isLastRecord.
                         * @member {boolean} isLastRecord
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.isLastRecord = false;
    
                        /**
                         * DataChangeRecord table.
                         * @member {string} table
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.table = "";
    
                        /**
                         * DataChangeRecord columnTypes.
                         * @member {Array.<google.spanner.executor.v1.DataChangeRecord.IColumnType>} columnTypes
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.columnTypes = $util.emptyArray;
    
                        /**
                         * DataChangeRecord mods.
                         * @member {Array.<google.spanner.executor.v1.DataChangeRecord.IMod>} mods
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.mods = $util.emptyArray;
    
                        /**
                         * DataChangeRecord modType.
                         * @member {string} modType
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.modType = "";
    
                        /**
                         * DataChangeRecord valueCaptureType.
                         * @member {string} valueCaptureType
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.valueCaptureType = "";
    
                        /**
                         * DataChangeRecord recordCount.
                         * @member {number|Long} recordCount
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.recordCount = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                        /**
                         * DataChangeRecord partitionCount.
                         * @member {number|Long} partitionCount
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.partitionCount = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                        /**
                         * DataChangeRecord transactionTag.
                         * @member {string} transactionTag
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.transactionTag = "";
    
                        /**
                         * DataChangeRecord isSystemTransaction.
                         * @member {boolean} isSystemTransaction
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.isSystemTransaction = false;
    
                        /**
                         * Creates a new DataChangeRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {google.spanner.executor.v1.IDataChangeRecord=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.DataChangeRecord} DataChangeRecord instance
                         */
                        DataChangeRecord.create = function create(properties) {
                            return new DataChangeRecord(properties);
                        };
    
                        /**
                         * Encodes the specified DataChangeRecord message. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {google.spanner.executor.v1.IDataChangeRecord} message DataChangeRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DataChangeRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.commitTime != null && Object.hasOwnProperty.call(message, "commitTime"))
                                $root.google.protobuf.Timestamp.encode(message.commitTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.transactionId != null && Object.hasOwnProperty.call(message, "transactionId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.transactionId);
                            if (message.isLastRecord != null && Object.hasOwnProperty.call(message, "isLastRecord"))
                                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isLastRecord);
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.table);
                            if (message.columnTypes != null && message.columnTypes.length)
                                for (var i = 0; i < message.columnTypes.length; ++i)
                                    $root.google.spanner.executor.v1.DataChangeRecord.ColumnType.encode(message.columnTypes[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                            if (message.mods != null && message.mods.length)
                                for (var i = 0; i < message.mods.length; ++i)
                                    $root.google.spanner.executor.v1.DataChangeRecord.Mod.encode(message.mods[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            if (message.modType != null && Object.hasOwnProperty.call(message, "modType"))
                                writer.uint32(/* id 8, wireType 2 =*/66).string(message.modType);
                            if (message.valueCaptureType != null && Object.hasOwnProperty.call(message, "valueCaptureType"))
                                writer.uint32(/* id 9, wireType 2 =*/74).string(message.valueCaptureType);
                            if (message.recordCount != null && Object.hasOwnProperty.call(message, "recordCount"))
                                writer.uint32(/* id 10, wireType 0 =*/80).int64(message.recordCount);
                            if (message.partitionCount != null && Object.hasOwnProperty.call(message, "partitionCount"))
                                writer.uint32(/* id 11, wireType 0 =*/88).int64(message.partitionCount);
                            if (message.transactionTag != null && Object.hasOwnProperty.call(message, "transactionTag"))
                                writer.uint32(/* id 12, wireType 2 =*/98).string(message.transactionTag);
                            if (message.isSystemTransaction != null && Object.hasOwnProperty.call(message, "isSystemTransaction"))
                                writer.uint32(/* id 13, wireType 0 =*/104).bool(message.isSystemTransaction);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DataChangeRecord message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {google.spanner.executor.v1.IDataChangeRecord} message DataChangeRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DataChangeRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DataChangeRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.DataChangeRecord} DataChangeRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DataChangeRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DataChangeRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.commitTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.transactionId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.isLastRecord = reader.bool();
                                        break;
                                    }
                                case 5: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 6: {
                                        if (!(message.columnTypes && message.columnTypes.length))
                                            message.columnTypes = [];
                                        message.columnTypes.push($root.google.spanner.executor.v1.DataChangeRecord.ColumnType.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 7: {
                                        if (!(message.mods && message.mods.length))
                                            message.mods = [];
                                        message.mods.push($root.google.spanner.executor.v1.DataChangeRecord.Mod.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 8: {
                                        message.modType = reader.string();
                                        break;
                                    }
                                case 9: {
                                        message.valueCaptureType = reader.string();
                                        break;
                                    }
                                case 10: {
                                        message.recordCount = reader.int64();
                                        break;
                                    }
                                case 11: {
                                        message.partitionCount = reader.int64();
                                        break;
                                    }
                                case 12: {
                                        message.transactionTag = reader.string();
                                        break;
                                    }
                                case 13: {
                                        message.isSystemTransaction = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DataChangeRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.DataChangeRecord} DataChangeRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DataChangeRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DataChangeRecord message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DataChangeRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.commitTime != null && message.hasOwnProperty("commitTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.commitTime);
                                if (error)
                                    return "commitTime." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.transactionId != null && message.hasOwnProperty("transactionId"))
                                if (!$util.isString(message.transactionId))
                                    return "transactionId: string expected";
                            if (message.isLastRecord != null && message.hasOwnProperty("isLastRecord"))
                                if (typeof message.isLastRecord !== "boolean")
                                    return "isLastRecord: boolean expected";
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.columnTypes != null && message.hasOwnProperty("columnTypes")) {
                                if (!Array.isArray(message.columnTypes))
                                    return "columnTypes: array expected";
                                for (var i = 0; i < message.columnTypes.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.DataChangeRecord.ColumnType.verify(message.columnTypes[i]);
                                    if (error)
                                        return "columnTypes." + error;
                                }
                            }
                            if (message.mods != null && message.hasOwnProperty("mods")) {
                                if (!Array.isArray(message.mods))
                                    return "mods: array expected";
                                for (var i = 0; i < message.mods.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.DataChangeRecord.Mod.verify(message.mods[i]);
                                    if (error)
                                        return "mods." + error;
                                }
                            }
                            if (message.modType != null && message.hasOwnProperty("modType"))
                                if (!$util.isString(message.modType))
                                    return "modType: string expected";
                            if (message.valueCaptureType != null && message.hasOwnProperty("valueCaptureType"))
                                if (!$util.isString(message.valueCaptureType))
                                    return "valueCaptureType: string expected";
                            if (message.recordCount != null && message.hasOwnProperty("recordCount"))
                                if (!$util.isInteger(message.recordCount) && !(message.recordCount && $util.isInteger(message.recordCount.low) && $util.isInteger(message.recordCount.high)))
                                    return "recordCount: integer|Long expected";
                            if (message.partitionCount != null && message.hasOwnProperty("partitionCount"))
                                if (!$util.isInteger(message.partitionCount) && !(message.partitionCount && $util.isInteger(message.partitionCount.low) && $util.isInteger(message.partitionCount.high)))
                                    return "partitionCount: integer|Long expected";
                            if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                                if (!$util.isString(message.transactionTag))
                                    return "transactionTag: string expected";
                            if (message.isSystemTransaction != null && message.hasOwnProperty("isSystemTransaction"))
                                if (typeof message.isSystemTransaction !== "boolean")
                                    return "isSystemTransaction: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a DataChangeRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.DataChangeRecord} DataChangeRecord
                         */
                        DataChangeRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.DataChangeRecord)
                                return object;
                            var message = new $root.google.spanner.executor.v1.DataChangeRecord();
                            if (object.commitTime != null) {
                                if (typeof object.commitTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.DataChangeRecord.commitTime: object expected");
                                message.commitTime = $root.google.protobuf.Timestamp.fromObject(object.commitTime);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.transactionId != null)
                                message.transactionId = String(object.transactionId);
                            if (object.isLastRecord != null)
                                message.isLastRecord = Boolean(object.isLastRecord);
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.columnTypes) {
                                if (!Array.isArray(object.columnTypes))
                                    throw TypeError(".google.spanner.executor.v1.DataChangeRecord.columnTypes: array expected");
                                message.columnTypes = [];
                                for (var i = 0; i < object.columnTypes.length; ++i) {
                                    if (typeof object.columnTypes[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.DataChangeRecord.columnTypes: object expected");
                                    message.columnTypes[i] = $root.google.spanner.executor.v1.DataChangeRecord.ColumnType.fromObject(object.columnTypes[i]);
                                }
                            }
                            if (object.mods) {
                                if (!Array.isArray(object.mods))
                                    throw TypeError(".google.spanner.executor.v1.DataChangeRecord.mods: array expected");
                                message.mods = [];
                                for (var i = 0; i < object.mods.length; ++i) {
                                    if (typeof object.mods[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.DataChangeRecord.mods: object expected");
                                    message.mods[i] = $root.google.spanner.executor.v1.DataChangeRecord.Mod.fromObject(object.mods[i]);
                                }
                            }
                            if (object.modType != null)
                                message.modType = String(object.modType);
                            if (object.valueCaptureType != null)
                                message.valueCaptureType = String(object.valueCaptureType);
                            if (object.recordCount != null)
                                if ($util.Long)
                                    (message.recordCount = $util.Long.fromValue(object.recordCount)).unsigned = false;
                                else if (typeof object.recordCount === "string")
                                    message.recordCount = parseInt(object.recordCount, 10);
                                else if (typeof object.recordCount === "number")
                                    message.recordCount = object.recordCount;
                                else if (typeof object.recordCount === "object")
                                    message.recordCount = new $util.LongBits(object.recordCount.low >>> 0, object.recordCount.high >>> 0).toNumber();
                            if (object.partitionCount != null)
                                if ($util.Long)
                                    (message.partitionCount = $util.Long.fromValue(object.partitionCount)).unsigned = false;
                                else if (typeof object.partitionCount === "string")
                                    message.partitionCount = parseInt(object.partitionCount, 10);
                                else if (typeof object.partitionCount === "number")
                                    message.partitionCount = object.partitionCount;
                                else if (typeof object.partitionCount === "object")
                                    message.partitionCount = new $util.LongBits(object.partitionCount.low >>> 0, object.partitionCount.high >>> 0).toNumber();
                            if (object.transactionTag != null)
                                message.transactionTag = String(object.transactionTag);
                            if (object.isSystemTransaction != null)
                                message.isSystemTransaction = Boolean(object.isSystemTransaction);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DataChangeRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {google.spanner.executor.v1.DataChangeRecord} message DataChangeRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DataChangeRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.columnTypes = [];
                                object.mods = [];
                            }
                            if (options.defaults) {
                                object.commitTime = null;
                                object.recordSequence = "";
                                object.transactionId = "";
                                object.isLastRecord = false;
                                object.table = "";
                                object.modType = "";
                                object.valueCaptureType = "";
                                if ($util.Long) {
                                    var long = new $util.Long(0, 0, false);
                                    object.recordCount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                } else
                                    object.recordCount = options.longs === String ? "0" : 0;
                                if ($util.Long) {
                                    var long = new $util.Long(0, 0, false);
                                    object.partitionCount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                } else
                                    object.partitionCount = options.longs === String ? "0" : 0;
                                object.transactionTag = "";
                                object.isSystemTransaction = false;
                            }
                            if (message.commitTime != null && message.hasOwnProperty("commitTime"))
                                object.commitTime = $root.google.protobuf.Timestamp.toObject(message.commitTime, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.transactionId != null && message.hasOwnProperty("transactionId"))
                                object.transactionId = message.transactionId;
                            if (message.isLastRecord != null && message.hasOwnProperty("isLastRecord"))
                                object.isLastRecord = message.isLastRecord;
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.columnTypes && message.columnTypes.length) {
                                object.columnTypes = [];
                                for (var j = 0; j < message.columnTypes.length; ++j)
                                    object.columnTypes[j] = $root.google.spanner.executor.v1.DataChangeRecord.ColumnType.toObject(message.columnTypes[j], options);
                            }
                            if (message.mods && message.mods.length) {
                                object.mods = [];
                                for (var j = 0; j < message.mods.length; ++j)
                                    object.mods[j] = $root.google.spanner.executor.v1.DataChangeRecord.Mod.toObject(message.mods[j], options);
                            }
                            if (message.modType != null && message.hasOwnProperty("modType"))
                                object.modType = message.modType;
                            if (message.valueCaptureType != null && message.hasOwnProperty("valueCaptureType"))
                                object.valueCaptureType = message.valueCaptureType;
                            if (message.recordCount != null && message.hasOwnProperty("recordCount"))
                                if (typeof message.recordCount === "number")
                                    object.recordCount = options.longs === String ? String(message.recordCount) : message.recordCount;
                                else
                                    object.recordCount = options.longs === String ? $util.Long.prototype.toString.call(message.recordCount) : options.longs === Number ? new $util.LongBits(message.recordCount.low >>> 0, message.recordCount.high >>> 0).toNumber() : message.recordCount;
                            if (message.partitionCount != null && message.hasOwnProperty("partitionCount"))
                                if (typeof message.partitionCount === "number")
                                    object.partitionCount = options.longs === String ? String(message.partitionCount) : message.partitionCount;
                                else
                                    object.partitionCount = options.longs === String ? $util.Long.prototype.toString.call(message.partitionCount) : options.longs === Number ? new $util.LongBits(message.partitionCount.low >>> 0, message.partitionCount.high >>> 0).toNumber() : message.partitionCount;
                            if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                                object.transactionTag = message.transactionTag;
                            if (message.isSystemTransaction != null && message.hasOwnProperty("isSystemTransaction"))
                                object.isSystemTransaction = message.isSystemTransaction;
                            return object;
                        };
    
                        /**
                         * Converts this DataChangeRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DataChangeRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DataChangeRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.DataChangeRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DataChangeRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.DataChangeRecord";
                        };
    
                        DataChangeRecord.ColumnType = (function() {
    
                            /**
                             * Properties of a ColumnType.
                             * @memberof google.spanner.executor.v1.DataChangeRecord
                             * @interface IColumnType
                             * @property {string|null} [name] ColumnType name
                             * @property {string|null} [type] ColumnType type
                             * @property {boolean|null} [isPrimaryKey] ColumnType isPrimaryKey
                             * @property {number|Long|null} [ordinalPosition] ColumnType ordinalPosition
                             */
    
                            /**
                             * Constructs a new ColumnType.
                             * @memberof google.spanner.executor.v1.DataChangeRecord
                             * @classdesc Represents a ColumnType.
                             * @implements IColumnType
                             * @constructor
                             * @param {google.spanner.executor.v1.DataChangeRecord.IColumnType=} [properties] Properties to set
                             */
                            function ColumnType(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ColumnType name.
                             * @member {string} name
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @instance
                             */
                            ColumnType.prototype.name = "";
    
                            /**
                             * ColumnType type.
                             * @member {string} type
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @instance
                             */
                            ColumnType.prototype.type = "";
    
                            /**
                             * ColumnType isPrimaryKey.
                             * @member {boolean} isPrimaryKey
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @instance
                             */
                            ColumnType.prototype.isPrimaryKey = false;
    
                            /**
                             * ColumnType ordinalPosition.
                             * @member {number|Long} ordinalPosition
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @instance
                             */
                            ColumnType.prototype.ordinalPosition = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Creates a new ColumnType instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IColumnType=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.DataChangeRecord.ColumnType} ColumnType instance
                             */
                            ColumnType.create = function create(properties) {
                                return new ColumnType(properties);
                            };
    
                            /**
                             * Encodes the specified ColumnType message. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.ColumnType.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IColumnType} message ColumnType message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ColumnType.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.type);
                                if (message.isPrimaryKey != null && Object.hasOwnProperty.call(message, "isPrimaryKey"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isPrimaryKey);
                                if (message.ordinalPosition != null && Object.hasOwnProperty.call(message, "ordinalPosition"))
                                    writer.uint32(/* id 4, wireType 0 =*/32).int64(message.ordinalPosition);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ColumnType message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.ColumnType.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IColumnType} message ColumnType message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ColumnType.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ColumnType message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.DataChangeRecord.ColumnType} ColumnType
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ColumnType.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DataChangeRecord.ColumnType();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.type = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.isPrimaryKey = reader.bool();
                                            break;
                                        }
                                    case 4: {
                                            message.ordinalPosition = reader.int64();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ColumnType message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.DataChangeRecord.ColumnType} ColumnType
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ColumnType.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ColumnType message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ColumnType.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.type != null && message.hasOwnProperty("type"))
                                    if (!$util.isString(message.type))
                                        return "type: string expected";
                                if (message.isPrimaryKey != null && message.hasOwnProperty("isPrimaryKey"))
                                    if (typeof message.isPrimaryKey !== "boolean")
                                        return "isPrimaryKey: boolean expected";
                                if (message.ordinalPosition != null && message.hasOwnProperty("ordinalPosition"))
                                    if (!$util.isInteger(message.ordinalPosition) && !(message.ordinalPosition && $util.isInteger(message.ordinalPosition.low) && $util.isInteger(message.ordinalPosition.high)))
                                        return "ordinalPosition: integer|Long expected";
                                return null;
                            };
    
                            /**
                             * Creates a ColumnType message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.DataChangeRecord.ColumnType} ColumnType
                             */
                            ColumnType.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.DataChangeRecord.ColumnType)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.DataChangeRecord.ColumnType();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.type != null)
                                    message.type = String(object.type);
                                if (object.isPrimaryKey != null)
                                    message.isPrimaryKey = Boolean(object.isPrimaryKey);
                                if (object.ordinalPosition != null)
                                    if ($util.Long)
                                        (message.ordinalPosition = $util.Long.fromValue(object.ordinalPosition)).unsigned = false;
                                    else if (typeof object.ordinalPosition === "string")
                                        message.ordinalPosition = parseInt(object.ordinalPosition, 10);
                                    else if (typeof object.ordinalPosition === "number")
                                        message.ordinalPosition = object.ordinalPosition;
                                    else if (typeof object.ordinalPosition === "object")
                                        message.ordinalPosition = new $util.LongBits(object.ordinalPosition.low >>> 0, object.ordinalPosition.high >>> 0).toNumber();
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ColumnType message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.ColumnType} message ColumnType
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ColumnType.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.type = "";
                                    object.isPrimaryKey = false;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.ordinalPosition = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.ordinalPosition = options.longs === String ? "0" : 0;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.type != null && message.hasOwnProperty("type"))
                                    object.type = message.type;
                                if (message.isPrimaryKey != null && message.hasOwnProperty("isPrimaryKey"))
                                    object.isPrimaryKey = message.isPrimaryKey;
                                if (message.ordinalPosition != null && message.hasOwnProperty("ordinalPosition"))
                                    if (typeof message.ordinalPosition === "number")
                                        object.ordinalPosition = options.longs === String ? String(message.ordinalPosition) : message.ordinalPosition;
                                    else
                                        object.ordinalPosition = options.longs === String ? $util.Long.prototype.toString.call(message.ordinalPosition) : options.longs === Number ? new $util.LongBits(message.ordinalPosition.low >>> 0, message.ordinalPosition.high >>> 0).toNumber() : message.ordinalPosition;
                                return object;
                            };
    
                            /**
                             * Converts this ColumnType to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ColumnType.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ColumnType
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.DataChangeRecord.ColumnType
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ColumnType.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.DataChangeRecord.ColumnType";
                            };
    
                            return ColumnType;
                        })();
    
                        DataChangeRecord.Mod = (function() {
    
                            /**
                             * Properties of a Mod.
                             * @memberof google.spanner.executor.v1.DataChangeRecord
                             * @interface IMod
                             * @property {string|null} [keys] Mod keys
                             * @property {string|null} [newValues] Mod newValues
                             * @property {string|null} [oldValues] Mod oldValues
                             */
    
                            /**
                             * Constructs a new Mod.
                             * @memberof google.spanner.executor.v1.DataChangeRecord
                             * @classdesc Represents a Mod.
                             * @implements IMod
                             * @constructor
                             * @param {google.spanner.executor.v1.DataChangeRecord.IMod=} [properties] Properties to set
                             */
                            function Mod(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Mod keys.
                             * @member {string} keys
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.keys = "";
    
                            /**
                             * Mod newValues.
                             * @member {string} newValues
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.newValues = "";
    
                            /**
                             * Mod oldValues.
                             * @member {string} oldValues
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.oldValues = "";
    
                            /**
                             * Creates a new Mod instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IMod=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.DataChangeRecord.Mod} Mod instance
                             */
                            Mod.create = function create(properties) {
                                return new Mod(properties);
                            };
    
                            /**
                             * Encodes the specified Mod message. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.Mod.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.keys != null && Object.hasOwnProperty.call(message, "keys"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.keys);
                                if (message.newValues != null && Object.hasOwnProperty.call(message, "newValues"))
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.newValues);
                                if (message.oldValues != null && Object.hasOwnProperty.call(message, "oldValues"))
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.oldValues);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Mod message, length delimited. Does not implicitly {@link google.spanner.executor.v1.DataChangeRecord.Mod.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.DataChangeRecord.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.DataChangeRecord.Mod();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.keys = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.newValues = reader.string();
                                            break;
                                        }
                                    case 3: {
                                            message.oldValues = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.DataChangeRecord.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Mod message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Mod.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.keys != null && message.hasOwnProperty("keys"))
                                    if (!$util.isString(message.keys))
                                        return "keys: string expected";
                                if (message.newValues != null && message.hasOwnProperty("newValues"))
                                    if (!$util.isString(message.newValues))
                                        return "newValues: string expected";
                                if (message.oldValues != null && message.hasOwnProperty("oldValues"))
                                    if (!$util.isString(message.oldValues))
                                        return "oldValues: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a Mod message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.DataChangeRecord.Mod} Mod
                             */
                            Mod.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.DataChangeRecord.Mod)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.DataChangeRecord.Mod();
                                if (object.keys != null)
                                    message.keys = String(object.keys);
                                if (object.newValues != null)
                                    message.newValues = String(object.newValues);
                                if (object.oldValues != null)
                                    message.oldValues = String(object.oldValues);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Mod message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.executor.v1.DataChangeRecord.Mod} message Mod
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Mod.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.keys = "";
                                    object.newValues = "";
                                    object.oldValues = "";
                                }
                                if (message.keys != null && message.hasOwnProperty("keys"))
                                    object.keys = message.keys;
                                if (message.newValues != null && message.hasOwnProperty("newValues"))
                                    object.newValues = message.newValues;
                                if (message.oldValues != null && message.hasOwnProperty("oldValues"))
                                    object.oldValues = message.oldValues;
                                return object;
                            };
    
                            /**
                             * Converts this Mod to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Mod.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Mod
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.DataChangeRecord.Mod
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Mod.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.DataChangeRecord.Mod";
                            };
    
                            return Mod;
                        })();
    
                        return DataChangeRecord;
                    })();
    
                    v1.ChildPartitionsRecord = (function() {
    
                        /**
                         * Properties of a ChildPartitionsRecord.
                         * @memberof google.spanner.executor.v1
                         * @interface IChildPartitionsRecord
                         * @property {google.protobuf.ITimestamp|null} [startTime] ChildPartitionsRecord startTime
                         * @property {string|null} [recordSequence] ChildPartitionsRecord recordSequence
                         * @property {Array.<google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition>|null} [childPartitions] ChildPartitionsRecord childPartitions
                         */
    
                        /**
                         * Constructs a new ChildPartitionsRecord.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a ChildPartitionsRecord.
                         * @implements IChildPartitionsRecord
                         * @constructor
                         * @param {google.spanner.executor.v1.IChildPartitionsRecord=} [properties] Properties to set
                         */
                        function ChildPartitionsRecord(properties) {
                            this.childPartitions = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ChildPartitionsRecord startTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} startTime
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @instance
                         */
                        ChildPartitionsRecord.prototype.startTime = null;
    
                        /**
                         * ChildPartitionsRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @instance
                         */
                        ChildPartitionsRecord.prototype.recordSequence = "";
    
                        /**
                         * ChildPartitionsRecord childPartitions.
                         * @member {Array.<google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition>} childPartitions
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @instance
                         */
                        ChildPartitionsRecord.prototype.childPartitions = $util.emptyArray;
    
                        /**
                         * Creates a new ChildPartitionsRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChildPartitionsRecord=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.ChildPartitionsRecord} ChildPartitionsRecord instance
                         */
                        ChildPartitionsRecord.create = function create(properties) {
                            return new ChildPartitionsRecord(properties);
                        };
    
                        /**
                         * Encodes the specified ChildPartitionsRecord message. Does not implicitly {@link google.spanner.executor.v1.ChildPartitionsRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChildPartitionsRecord} message ChildPartitionsRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChildPartitionsRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                                $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.childPartitions != null && message.childPartitions.length)
                                for (var i = 0; i < message.childPartitions.length; ++i)
                                    $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.encode(message.childPartitions[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ChildPartitionsRecord message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ChildPartitionsRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {google.spanner.executor.v1.IChildPartitionsRecord} message ChildPartitionsRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChildPartitionsRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ChildPartitionsRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.ChildPartitionsRecord} ChildPartitionsRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChildPartitionsRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ChildPartitionsRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        if (!(message.childPartitions && message.childPartitions.length))
                                            message.childPartitions = [];
                                        message.childPartitions.push($root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ChildPartitionsRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.ChildPartitionsRecord} ChildPartitionsRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChildPartitionsRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ChildPartitionsRecord message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ChildPartitionsRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.startTime != null && message.hasOwnProperty("startTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                                if (error)
                                    return "startTime." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.childPartitions != null && message.hasOwnProperty("childPartitions")) {
                                if (!Array.isArray(message.childPartitions))
                                    return "childPartitions: array expected";
                                for (var i = 0; i < message.childPartitions.length; ++i) {
                                    var error = $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.verify(message.childPartitions[i]);
                                    if (error)
                                        return "childPartitions." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ChildPartitionsRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.ChildPartitionsRecord} ChildPartitionsRecord
                         */
                        ChildPartitionsRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.ChildPartitionsRecord)
                                return object;
                            var message = new $root.google.spanner.executor.v1.ChildPartitionsRecord();
                            if (object.startTime != null) {
                                if (typeof object.startTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.ChildPartitionsRecord.startTime: object expected");
                                message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.childPartitions) {
                                if (!Array.isArray(object.childPartitions))
                                    throw TypeError(".google.spanner.executor.v1.ChildPartitionsRecord.childPartitions: array expected");
                                message.childPartitions = [];
                                for (var i = 0; i < object.childPartitions.length; ++i) {
                                    if (typeof object.childPartitions[i] !== "object")
                                        throw TypeError(".google.spanner.executor.v1.ChildPartitionsRecord.childPartitions: object expected");
                                    message.childPartitions[i] = $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.fromObject(object.childPartitions[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ChildPartitionsRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {google.spanner.executor.v1.ChildPartitionsRecord} message ChildPartitionsRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ChildPartitionsRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.childPartitions = [];
                            if (options.defaults) {
                                object.startTime = null;
                                object.recordSequence = "";
                            }
                            if (message.startTime != null && message.hasOwnProperty("startTime"))
                                object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.childPartitions && message.childPartitions.length) {
                                object.childPartitions = [];
                                for (var j = 0; j < message.childPartitions.length; ++j)
                                    object.childPartitions[j] = $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.toObject(message.childPartitions[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ChildPartitionsRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ChildPartitionsRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ChildPartitionsRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ChildPartitionsRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.ChildPartitionsRecord";
                        };
    
                        ChildPartitionsRecord.ChildPartition = (function() {
    
                            /**
                             * Properties of a ChildPartition.
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                             * @interface IChildPartition
                             * @property {string|null} [token] ChildPartition token
                             * @property {Array.<string>|null} [parentPartitionTokens] ChildPartition parentPartitionTokens
                             */
    
                            /**
                             * Constructs a new ChildPartition.
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord
                             * @classdesc Represents a ChildPartition.
                             * @implements IChildPartition
                             * @constructor
                             * @param {google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition=} [properties] Properties to set
                             */
                            function ChildPartition(properties) {
                                this.parentPartitionTokens = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ChildPartition token.
                             * @member {string} token
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @instance
                             */
                            ChildPartition.prototype.token = "";
    
                            /**
                             * ChildPartition parentPartitionTokens.
                             * @member {Array.<string>} parentPartitionTokens
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @instance
                             */
                            ChildPartition.prototype.parentPartitionTokens = $util.emptyArray;
    
                            /**
                             * Creates a new ChildPartition instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition=} [properties] Properties to set
                             * @returns {google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition} ChildPartition instance
                             */
                            ChildPartition.create = function create(properties) {
                                return new ChildPartition(properties);
                            };
    
                            /**
                             * Encodes the specified ChildPartition message. Does not implicitly {@link google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition} message ChildPartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ChildPartition.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.token != null && Object.hasOwnProperty.call(message, "token"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.token);
                                if (message.parentPartitionTokens != null && message.parentPartitionTokens.length)
                                    for (var i = 0; i < message.parentPartitionTokens.length; ++i)
                                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.parentPartitionTokens[i]);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ChildPartition message, length delimited. Does not implicitly {@link google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {google.spanner.executor.v1.ChildPartitionsRecord.IChildPartition} message ChildPartition message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ChildPartition.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ChildPartition message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition} ChildPartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ChildPartition.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.token = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.parentPartitionTokens && message.parentPartitionTokens.length))
                                                message.parentPartitionTokens = [];
                                            message.parentPartitionTokens.push(reader.string());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ChildPartition message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition} ChildPartition
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ChildPartition.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ChildPartition message.
                             * @function verify
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ChildPartition.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.token != null && message.hasOwnProperty("token"))
                                    if (!$util.isString(message.token))
                                        return "token: string expected";
                                if (message.parentPartitionTokens != null && message.hasOwnProperty("parentPartitionTokens")) {
                                    if (!Array.isArray(message.parentPartitionTokens))
                                        return "parentPartitionTokens: array expected";
                                    for (var i = 0; i < message.parentPartitionTokens.length; ++i)
                                        if (!$util.isString(message.parentPartitionTokens[i]))
                                            return "parentPartitionTokens: string[] expected";
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ChildPartition message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition} ChildPartition
                             */
                            ChildPartition.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition)
                                    return object;
                                var message = new $root.google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition();
                                if (object.token != null)
                                    message.token = String(object.token);
                                if (object.parentPartitionTokens) {
                                    if (!Array.isArray(object.parentPartitionTokens))
                                        throw TypeError(".google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition.parentPartitionTokens: array expected");
                                    message.parentPartitionTokens = [];
                                    for (var i = 0; i < object.parentPartitionTokens.length; ++i)
                                        message.parentPartitionTokens[i] = String(object.parentPartitionTokens[i]);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ChildPartition message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition} message ChildPartition
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ChildPartition.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults)
                                    object.parentPartitionTokens = [];
                                if (options.defaults)
                                    object.token = "";
                                if (message.token != null && message.hasOwnProperty("token"))
                                    object.token = message.token;
                                if (message.parentPartitionTokens && message.parentPartitionTokens.length) {
                                    object.parentPartitionTokens = [];
                                    for (var j = 0; j < message.parentPartitionTokens.length; ++j)
                                        object.parentPartitionTokens[j] = message.parentPartitionTokens[j];
                                }
                                return object;
                            };
    
                            /**
                             * Converts this ChildPartition to JSON.
                             * @function toJSON
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ChildPartition.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ChildPartition
                             * @function getTypeUrl
                             * @memberof google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ChildPartition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.executor.v1.ChildPartitionsRecord.ChildPartition";
                            };
    
                            return ChildPartition;
                        })();
    
                        return ChildPartitionsRecord;
                    })();
    
                    v1.HeartbeatRecord = (function() {
    
                        /**
                         * Properties of a HeartbeatRecord.
                         * @memberof google.spanner.executor.v1
                         * @interface IHeartbeatRecord
                         * @property {google.protobuf.ITimestamp|null} [heartbeatTime] HeartbeatRecord heartbeatTime
                         */
    
                        /**
                         * Constructs a new HeartbeatRecord.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a HeartbeatRecord.
                         * @implements IHeartbeatRecord
                         * @constructor
                         * @param {google.spanner.executor.v1.IHeartbeatRecord=} [properties] Properties to set
                         */
                        function HeartbeatRecord(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * HeartbeatRecord heartbeatTime.
                         * @member {google.protobuf.ITimestamp|null|undefined} heartbeatTime
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @instance
                         */
                        HeartbeatRecord.prototype.heartbeatTime = null;
    
                        /**
                         * Creates a new HeartbeatRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {google.spanner.executor.v1.IHeartbeatRecord=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.HeartbeatRecord} HeartbeatRecord instance
                         */
                        HeartbeatRecord.create = function create(properties) {
                            return new HeartbeatRecord(properties);
                        };
    
                        /**
                         * Encodes the specified HeartbeatRecord message. Does not implicitly {@link google.spanner.executor.v1.HeartbeatRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {google.spanner.executor.v1.IHeartbeatRecord} message HeartbeatRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        HeartbeatRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.heartbeatTime != null && Object.hasOwnProperty.call(message, "heartbeatTime"))
                                $root.google.protobuf.Timestamp.encode(message.heartbeatTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified HeartbeatRecord message, length delimited. Does not implicitly {@link google.spanner.executor.v1.HeartbeatRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {google.spanner.executor.v1.IHeartbeatRecord} message HeartbeatRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        HeartbeatRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a HeartbeatRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.HeartbeatRecord} HeartbeatRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        HeartbeatRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.HeartbeatRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.heartbeatTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a HeartbeatRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.HeartbeatRecord} HeartbeatRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        HeartbeatRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a HeartbeatRecord message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        HeartbeatRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.heartbeatTime != null && message.hasOwnProperty("heartbeatTime")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.heartbeatTime);
                                if (error)
                                    return "heartbeatTime." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a HeartbeatRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.HeartbeatRecord} HeartbeatRecord
                         */
                        HeartbeatRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.HeartbeatRecord)
                                return object;
                            var message = new $root.google.spanner.executor.v1.HeartbeatRecord();
                            if (object.heartbeatTime != null) {
                                if (typeof object.heartbeatTime !== "object")
                                    throw TypeError(".google.spanner.executor.v1.HeartbeatRecord.heartbeatTime: object expected");
                                message.heartbeatTime = $root.google.protobuf.Timestamp.fromObject(object.heartbeatTime);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a HeartbeatRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {google.spanner.executor.v1.HeartbeatRecord} message HeartbeatRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        HeartbeatRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.heartbeatTime = null;
                            if (message.heartbeatTime != null && message.hasOwnProperty("heartbeatTime"))
                                object.heartbeatTime = $root.google.protobuf.Timestamp.toObject(message.heartbeatTime, options);
                            return object;
                        };
    
                        /**
                         * Converts this HeartbeatRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        HeartbeatRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for HeartbeatRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.HeartbeatRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        HeartbeatRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.HeartbeatRecord";
                        };
    
                        return HeartbeatRecord;
                    })();
    
                    v1.SpannerOptions = (function() {
    
                        /**
                         * Properties of a SpannerOptions.
                         * @memberof google.spanner.executor.v1
                         * @interface ISpannerOptions
                         * @property {google.spanner.executor.v1.ISessionPoolOptions|null} [sessionPoolOptions] SpannerOptions sessionPoolOptions
                         */
    
                        /**
                         * Constructs a new SpannerOptions.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SpannerOptions.
                         * @implements ISpannerOptions
                         * @constructor
                         * @param {google.spanner.executor.v1.ISpannerOptions=} [properties] Properties to set
                         */
                        function SpannerOptions(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SpannerOptions sessionPoolOptions.
                         * @member {google.spanner.executor.v1.ISessionPoolOptions|null|undefined} sessionPoolOptions
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @instance
                         */
                        SpannerOptions.prototype.sessionPoolOptions = null;
    
                        /**
                         * Creates a new SpannerOptions instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerOptions=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SpannerOptions} SpannerOptions instance
                         */
                        SpannerOptions.create = function create(properties) {
                            return new SpannerOptions(properties);
                        };
    
                        /**
                         * Encodes the specified SpannerOptions message. Does not implicitly {@link google.spanner.executor.v1.SpannerOptions.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerOptions} message SpannerOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerOptions.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.sessionPoolOptions != null && Object.hasOwnProperty.call(message, "sessionPoolOptions"))
                                $root.google.spanner.executor.v1.SessionPoolOptions.encode(message.sessionPoolOptions, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SpannerOptions message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SpannerOptions.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISpannerOptions} message SpannerOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SpannerOptions.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SpannerOptions message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SpannerOptions} SpannerOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerOptions.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SpannerOptions();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.sessionPoolOptions = $root.google.spanner.executor.v1.SessionPoolOptions.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SpannerOptions message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SpannerOptions} SpannerOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SpannerOptions.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SpannerOptions message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SpannerOptions.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.sessionPoolOptions != null && message.hasOwnProperty("sessionPoolOptions")) {
                                var error = $root.google.spanner.executor.v1.SessionPoolOptions.verify(message.sessionPoolOptions);
                                if (error)
                                    return "sessionPoolOptions." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a SpannerOptions message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SpannerOptions} SpannerOptions
                         */
                        SpannerOptions.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SpannerOptions)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SpannerOptions();
                            if (object.sessionPoolOptions != null) {
                                if (typeof object.sessionPoolOptions !== "object")
                                    throw TypeError(".google.spanner.executor.v1.SpannerOptions.sessionPoolOptions: object expected");
                                message.sessionPoolOptions = $root.google.spanner.executor.v1.SessionPoolOptions.fromObject(object.sessionPoolOptions);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SpannerOptions message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {google.spanner.executor.v1.SpannerOptions} message SpannerOptions
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SpannerOptions.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.sessionPoolOptions = null;
                            if (message.sessionPoolOptions != null && message.hasOwnProperty("sessionPoolOptions"))
                                object.sessionPoolOptions = $root.google.spanner.executor.v1.SessionPoolOptions.toObject(message.sessionPoolOptions, options);
                            return object;
                        };
    
                        /**
                         * Converts this SpannerOptions to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SpannerOptions.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SpannerOptions
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SpannerOptions
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SpannerOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SpannerOptions";
                        };
    
                        return SpannerOptions;
                    })();
    
                    v1.SessionPoolOptions = (function() {
    
                        /**
                         * Properties of a SessionPoolOptions.
                         * @memberof google.spanner.executor.v1
                         * @interface ISessionPoolOptions
                         * @property {boolean|null} [useMultiplexed] SessionPoolOptions useMultiplexed
                         */
    
                        /**
                         * Constructs a new SessionPoolOptions.
                         * @memberof google.spanner.executor.v1
                         * @classdesc Represents a SessionPoolOptions.
                         * @implements ISessionPoolOptions
                         * @constructor
                         * @param {google.spanner.executor.v1.ISessionPoolOptions=} [properties] Properties to set
                         */
                        function SessionPoolOptions(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SessionPoolOptions useMultiplexed.
                         * @member {boolean} useMultiplexed
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @instance
                         */
                        SessionPoolOptions.prototype.useMultiplexed = false;
    
                        /**
                         * Creates a new SessionPoolOptions instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISessionPoolOptions=} [properties] Properties to set
                         * @returns {google.spanner.executor.v1.SessionPoolOptions} SessionPoolOptions instance
                         */
                        SessionPoolOptions.create = function create(properties) {
                            return new SessionPoolOptions(properties);
                        };
    
                        /**
                         * Encodes the specified SessionPoolOptions message. Does not implicitly {@link google.spanner.executor.v1.SessionPoolOptions.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISessionPoolOptions} message SessionPoolOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SessionPoolOptions.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.useMultiplexed != null && Object.hasOwnProperty.call(message, "useMultiplexed"))
                                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.useMultiplexed);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SessionPoolOptions message, length delimited. Does not implicitly {@link google.spanner.executor.v1.SessionPoolOptions.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {google.spanner.executor.v1.ISessionPoolOptions} message SessionPoolOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SessionPoolOptions.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SessionPoolOptions message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.executor.v1.SessionPoolOptions} SessionPoolOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SessionPoolOptions.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.executor.v1.SessionPoolOptions();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.useMultiplexed = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SessionPoolOptions message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.executor.v1.SessionPoolOptions} SessionPoolOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SessionPoolOptions.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SessionPoolOptions message.
                         * @function verify
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SessionPoolOptions.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.useMultiplexed != null && message.hasOwnProperty("useMultiplexed"))
                                if (typeof message.useMultiplexed !== "boolean")
                                    return "useMultiplexed: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a SessionPoolOptions message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.executor.v1.SessionPoolOptions} SessionPoolOptions
                         */
                        SessionPoolOptions.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.executor.v1.SessionPoolOptions)
                                return object;
                            var message = new $root.google.spanner.executor.v1.SessionPoolOptions();
                            if (object.useMultiplexed != null)
                                message.useMultiplexed = Boolean(object.useMultiplexed);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SessionPoolOptions message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {google.spanner.executor.v1.SessionPoolOptions} message SessionPoolOptions
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SessionPoolOptions.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.useMultiplexed = false;
                            if (message.useMultiplexed != null && message.hasOwnProperty("useMultiplexed"))
                                object.useMultiplexed = message.useMultiplexed;
                            return object;
                        };
    
                        /**
                         * Converts this SessionPoolOptions to JSON.
                         * @function toJSON
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SessionPoolOptions.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for SessionPoolOptions
                         * @function getTypeUrl
                         * @memberof google.spanner.executor.v1.SessionPoolOptions
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        SessionPoolOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.executor.v1.SessionPoolOptions";
                        };
    
                        return SessionPoolOptions;
                    })();
    
                    return v1;
                })();
    
                return executor;
            })();
    
            spanner.v1 = (function() {
    
                /**
                 * Namespace v1.
                 * @memberof google.spanner
                 * @namespace
                 */
                var v1 = {};
    
                v1.Spanner = (function() {
    
                    /**
                     * Constructs a new Spanner service.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Spanner
                     * @extends $protobuf.rpc.Service
                     * @constructor
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     */
                    function Spanner(rpcImpl, requestDelimited, responseDelimited) {
                        $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                    }
    
                    (Spanner.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = Spanner;
    
                    /**
                     * Creates new Spanner service using the specified rpc implementation.
                     * @function create
                     * @memberof google.spanner.v1.Spanner
                     * @static
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     * @returns {Spanner} RPC service. Useful where requests and/or responses are streamed.
                     */
                    Spanner.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                        return new this(rpcImpl, requestDelimited, responseDelimited);
                    };
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|createSession}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef CreateSessionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.Session} [response] Session
                     */
    
                    /**
                     * Calls CreateSession.
                     * @function createSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.ICreateSessionRequest} request CreateSessionRequest message or plain object
                     * @param {google.spanner.v1.Spanner.CreateSessionCallback} callback Node-style callback called with the error, if any, and Session
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.createSession = function createSession(request, callback) {
                        return this.rpcCall(createSession, $root.google.spanner.v1.CreateSessionRequest, $root.google.spanner.v1.Session, request, callback);
                    }, "name", { value: "CreateSession" });
    
                    /**
                     * Calls CreateSession.
                     * @function createSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.ICreateSessionRequest} request CreateSessionRequest message or plain object
                     * @returns {Promise<google.spanner.v1.Session>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|batchCreateSessions}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef BatchCreateSessionsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.BatchCreateSessionsResponse} [response] BatchCreateSessionsResponse
                     */
    
                    /**
                     * Calls BatchCreateSessions.
                     * @function batchCreateSessions
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest} request BatchCreateSessionsRequest message or plain object
                     * @param {google.spanner.v1.Spanner.BatchCreateSessionsCallback} callback Node-style callback called with the error, if any, and BatchCreateSessionsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.batchCreateSessions = function batchCreateSessions(request, callback) {
                        return this.rpcCall(batchCreateSessions, $root.google.spanner.v1.BatchCreateSessionsRequest, $root.google.spanner.v1.BatchCreateSessionsResponse, request, callback);
                    }, "name", { value: "BatchCreateSessions" });
    
                    /**
                     * Calls BatchCreateSessions.
                     * @function batchCreateSessions
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest} request BatchCreateSessionsRequest message or plain object
                     * @returns {Promise<google.spanner.v1.BatchCreateSessionsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|getSession}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef GetSessionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.Session} [response] Session
                     */
    
                    /**
                     * Calls GetSession.
                     * @function getSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IGetSessionRequest} request GetSessionRequest message or plain object
                     * @param {google.spanner.v1.Spanner.GetSessionCallback} callback Node-style callback called with the error, if any, and Session
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.getSession = function getSession(request, callback) {
                        return this.rpcCall(getSession, $root.google.spanner.v1.GetSessionRequest, $root.google.spanner.v1.Session, request, callback);
                    }, "name", { value: "GetSession" });
    
                    /**
                     * Calls GetSession.
                     * @function getSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IGetSessionRequest} request GetSessionRequest message or plain object
                     * @returns {Promise<google.spanner.v1.Session>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|listSessions}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef ListSessionsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.ListSessionsResponse} [response] ListSessionsResponse
                     */
    
                    /**
                     * Calls ListSessions.
                     * @function listSessions
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IListSessionsRequest} request ListSessionsRequest message or plain object
                     * @param {google.spanner.v1.Spanner.ListSessionsCallback} callback Node-style callback called with the error, if any, and ListSessionsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.listSessions = function listSessions(request, callback) {
                        return this.rpcCall(listSessions, $root.google.spanner.v1.ListSessionsRequest, $root.google.spanner.v1.ListSessionsResponse, request, callback);
                    }, "name", { value: "ListSessions" });
    
                    /**
                     * Calls ListSessions.
                     * @function listSessions
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IListSessionsRequest} request ListSessionsRequest message or plain object
                     * @returns {Promise<google.spanner.v1.ListSessionsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|deleteSession}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef DeleteSessionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteSession.
                     * @function deleteSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IDeleteSessionRequest} request DeleteSessionRequest message or plain object
                     * @param {google.spanner.v1.Spanner.DeleteSessionCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.deleteSession = function deleteSession(request, callback) {
                        return this.rpcCall(deleteSession, $root.google.spanner.v1.DeleteSessionRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteSession" });
    
                    /**
                     * Calls DeleteSession.
                     * @function deleteSession
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IDeleteSessionRequest} request DeleteSessionRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|executeSql}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef ExecuteSqlCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.ResultSet} [response] ResultSet
                     */
    
                    /**
                     * Calls ExecuteSql.
                     * @function executeSql
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteSqlRequest} request ExecuteSqlRequest message or plain object
                     * @param {google.spanner.v1.Spanner.ExecuteSqlCallback} callback Node-style callback called with the error, if any, and ResultSet
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.executeSql = function executeSql(request, callback) {
                        return this.rpcCall(executeSql, $root.google.spanner.v1.ExecuteSqlRequest, $root.google.spanner.v1.ResultSet, request, callback);
                    }, "name", { value: "ExecuteSql" });
    
                    /**
                     * Calls ExecuteSql.
                     * @function executeSql
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteSqlRequest} request ExecuteSqlRequest message or plain object
                     * @returns {Promise<google.spanner.v1.ResultSet>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|executeStreamingSql}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef ExecuteStreamingSqlCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.PartialResultSet} [response] PartialResultSet
                     */
    
                    /**
                     * Calls ExecuteStreamingSql.
                     * @function executeStreamingSql
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteSqlRequest} request ExecuteSqlRequest message or plain object
                     * @param {google.spanner.v1.Spanner.ExecuteStreamingSqlCallback} callback Node-style callback called with the error, if any, and PartialResultSet
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.executeStreamingSql = function executeStreamingSql(request, callback) {
                        return this.rpcCall(executeStreamingSql, $root.google.spanner.v1.ExecuteSqlRequest, $root.google.spanner.v1.PartialResultSet, request, callback);
                    }, "name", { value: "ExecuteStreamingSql" });
    
                    /**
                     * Calls ExecuteStreamingSql.
                     * @function executeStreamingSql
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteSqlRequest} request ExecuteSqlRequest message or plain object
                     * @returns {Promise<google.spanner.v1.PartialResultSet>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|executeBatchDml}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef ExecuteBatchDmlCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.ExecuteBatchDmlResponse} [response] ExecuteBatchDmlResponse
                     */
    
                    /**
                     * Calls ExecuteBatchDml.
                     * @function executeBatchDml
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest} request ExecuteBatchDmlRequest message or plain object
                     * @param {google.spanner.v1.Spanner.ExecuteBatchDmlCallback} callback Node-style callback called with the error, if any, and ExecuteBatchDmlResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.executeBatchDml = function executeBatchDml(request, callback) {
                        return this.rpcCall(executeBatchDml, $root.google.spanner.v1.ExecuteBatchDmlRequest, $root.google.spanner.v1.ExecuteBatchDmlResponse, request, callback);
                    }, "name", { value: "ExecuteBatchDml" });
    
                    /**
                     * Calls ExecuteBatchDml.
                     * @function executeBatchDml
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest} request ExecuteBatchDmlRequest message or plain object
                     * @returns {Promise<google.spanner.v1.ExecuteBatchDmlResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|read}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef ReadCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.ResultSet} [response] ResultSet
                     */
    
                    /**
                     * Calls Read.
                     * @function read
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IReadRequest} request ReadRequest message or plain object
                     * @param {google.spanner.v1.Spanner.ReadCallback} callback Node-style callback called with the error, if any, and ResultSet
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.read = function read(request, callback) {
                        return this.rpcCall(read, $root.google.spanner.v1.ReadRequest, $root.google.spanner.v1.ResultSet, request, callback);
                    }, "name", { value: "Read" });
    
                    /**
                     * Calls Read.
                     * @function read
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IReadRequest} request ReadRequest message or plain object
                     * @returns {Promise<google.spanner.v1.ResultSet>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|streamingRead}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef StreamingReadCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.PartialResultSet} [response] PartialResultSet
                     */
    
                    /**
                     * Calls StreamingRead.
                     * @function streamingRead
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IReadRequest} request ReadRequest message or plain object
                     * @param {google.spanner.v1.Spanner.StreamingReadCallback} callback Node-style callback called with the error, if any, and PartialResultSet
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.streamingRead = function streamingRead(request, callback) {
                        return this.rpcCall(streamingRead, $root.google.spanner.v1.ReadRequest, $root.google.spanner.v1.PartialResultSet, request, callback);
                    }, "name", { value: "StreamingRead" });
    
                    /**
                     * Calls StreamingRead.
                     * @function streamingRead
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IReadRequest} request ReadRequest message or plain object
                     * @returns {Promise<google.spanner.v1.PartialResultSet>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|beginTransaction}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef BeginTransactionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.Transaction} [response] Transaction
                     */
    
                    /**
                     * Calls BeginTransaction.
                     * @function beginTransaction
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBeginTransactionRequest} request BeginTransactionRequest message or plain object
                     * @param {google.spanner.v1.Spanner.BeginTransactionCallback} callback Node-style callback called with the error, if any, and Transaction
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.beginTransaction = function beginTransaction(request, callback) {
                        return this.rpcCall(beginTransaction, $root.google.spanner.v1.BeginTransactionRequest, $root.google.spanner.v1.Transaction, request, callback);
                    }, "name", { value: "BeginTransaction" });
    
                    /**
                     * Calls BeginTransaction.
                     * @function beginTransaction
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBeginTransactionRequest} request BeginTransactionRequest message or plain object
                     * @returns {Promise<google.spanner.v1.Transaction>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|commit}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef CommitCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.CommitResponse} [response] CommitResponse
                     */
    
                    /**
                     * Calls Commit.
                     * @function commit
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.ICommitRequest} request CommitRequest message or plain object
                     * @param {google.spanner.v1.Spanner.CommitCallback} callback Node-style callback called with the error, if any, and CommitResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.commit = function commit(request, callback) {
                        return this.rpcCall(commit, $root.google.spanner.v1.CommitRequest, $root.google.spanner.v1.CommitResponse, request, callback);
                    }, "name", { value: "Commit" });
    
                    /**
                     * Calls Commit.
                     * @function commit
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.ICommitRequest} request CommitRequest message or plain object
                     * @returns {Promise<google.spanner.v1.CommitResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|rollback}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef RollbackCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls Rollback.
                     * @function rollback
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IRollbackRequest} request RollbackRequest message or plain object
                     * @param {google.spanner.v1.Spanner.RollbackCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.rollback = function rollback(request, callback) {
                        return this.rpcCall(rollback, $root.google.spanner.v1.RollbackRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "Rollback" });
    
                    /**
                     * Calls Rollback.
                     * @function rollback
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IRollbackRequest} request RollbackRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|partitionQuery}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef PartitionQueryCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.PartitionResponse} [response] PartitionResponse
                     */
    
                    /**
                     * Calls PartitionQuery.
                     * @function partitionQuery
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IPartitionQueryRequest} request PartitionQueryRequest message or plain object
                     * @param {google.spanner.v1.Spanner.PartitionQueryCallback} callback Node-style callback called with the error, if any, and PartitionResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.partitionQuery = function partitionQuery(request, callback) {
                        return this.rpcCall(partitionQuery, $root.google.spanner.v1.PartitionQueryRequest, $root.google.spanner.v1.PartitionResponse, request, callback);
                    }, "name", { value: "PartitionQuery" });
    
                    /**
                     * Calls PartitionQuery.
                     * @function partitionQuery
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IPartitionQueryRequest} request PartitionQueryRequest message or plain object
                     * @returns {Promise<google.spanner.v1.PartitionResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|partitionRead}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef PartitionReadCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.PartitionResponse} [response] PartitionResponse
                     */
    
                    /**
                     * Calls PartitionRead.
                     * @function partitionRead
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IPartitionReadRequest} request PartitionReadRequest message or plain object
                     * @param {google.spanner.v1.Spanner.PartitionReadCallback} callback Node-style callback called with the error, if any, and PartitionResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.partitionRead = function partitionRead(request, callback) {
                        return this.rpcCall(partitionRead, $root.google.spanner.v1.PartitionReadRequest, $root.google.spanner.v1.PartitionResponse, request, callback);
                    }, "name", { value: "PartitionRead" });
    
                    /**
                     * Calls PartitionRead.
                     * @function partitionRead
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IPartitionReadRequest} request PartitionReadRequest message or plain object
                     * @returns {Promise<google.spanner.v1.PartitionResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.spanner.v1.Spanner|batchWrite}.
                     * @memberof google.spanner.v1.Spanner
                     * @typedef BatchWriteCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.spanner.v1.BatchWriteResponse} [response] BatchWriteResponse
                     */
    
                    /**
                     * Calls BatchWrite.
                     * @function batchWrite
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBatchWriteRequest} request BatchWriteRequest message or plain object
                     * @param {google.spanner.v1.Spanner.BatchWriteCallback} callback Node-style callback called with the error, if any, and BatchWriteResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(Spanner.prototype.batchWrite = function batchWrite(request, callback) {
                        return this.rpcCall(batchWrite, $root.google.spanner.v1.BatchWriteRequest, $root.google.spanner.v1.BatchWriteResponse, request, callback);
                    }, "name", { value: "BatchWrite" });
    
                    /**
                     * Calls BatchWrite.
                     * @function batchWrite
                     * @memberof google.spanner.v1.Spanner
                     * @instance
                     * @param {google.spanner.v1.IBatchWriteRequest} request BatchWriteRequest message or plain object
                     * @returns {Promise<google.spanner.v1.BatchWriteResponse>} Promise
                     * @variation 2
                     */
    
                    return Spanner;
                })();
    
                v1.CreateSessionRequest = (function() {
    
                    /**
                     * Properties of a CreateSessionRequest.
                     * @memberof google.spanner.v1
                     * @interface ICreateSessionRequest
                     * @property {string|null} [database] CreateSessionRequest database
                     * @property {google.spanner.v1.ISession|null} [session] CreateSessionRequest session
                     */
    
                    /**
                     * Constructs a new CreateSessionRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a CreateSessionRequest.
                     * @implements ICreateSessionRequest
                     * @constructor
                     * @param {google.spanner.v1.ICreateSessionRequest=} [properties] Properties to set
                     */
                    function CreateSessionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateSessionRequest database.
                     * @member {string} database
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @instance
                     */
                    CreateSessionRequest.prototype.database = "";
    
                    /**
                     * CreateSessionRequest session.
                     * @member {google.spanner.v1.ISession|null|undefined} session
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @instance
                     */
                    CreateSessionRequest.prototype.session = null;
    
                    /**
                     * Creates a new CreateSessionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {google.spanner.v1.ICreateSessionRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.CreateSessionRequest} CreateSessionRequest instance
                     */
                    CreateSessionRequest.create = function create(properties) {
                        return new CreateSessionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateSessionRequest message. Does not implicitly {@link google.spanner.v1.CreateSessionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {google.spanner.v1.ICreateSessionRequest} message CreateSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateSessionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            $root.google.spanner.v1.Session.encode(message.session, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateSessionRequest message, length delimited. Does not implicitly {@link google.spanner.v1.CreateSessionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {google.spanner.v1.ICreateSessionRequest} message CreateSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateSessionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateSessionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.CreateSessionRequest} CreateSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateSessionRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.CreateSessionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.database = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.session = $root.google.spanner.v1.Session.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateSessionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.CreateSessionRequest} CreateSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateSessionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateSessionRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateSessionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.database != null && message.hasOwnProperty("database"))
                            if (!$util.isString(message.database))
                                return "database: string expected";
                        if (message.session != null && message.hasOwnProperty("session")) {
                            var error = $root.google.spanner.v1.Session.verify(message.session);
                            if (error)
                                return "session." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CreateSessionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.CreateSessionRequest} CreateSessionRequest
                     */
                    CreateSessionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.CreateSessionRequest)
                            return object;
                        var message = new $root.google.spanner.v1.CreateSessionRequest();
                        if (object.database != null)
                            message.database = String(object.database);
                        if (object.session != null) {
                            if (typeof object.session !== "object")
                                throw TypeError(".google.spanner.v1.CreateSessionRequest.session: object expected");
                            message.session = $root.google.spanner.v1.Session.fromObject(object.session);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateSessionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {google.spanner.v1.CreateSessionRequest} message CreateSessionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateSessionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.database = "";
                            object.session = null;
                        }
                        if (message.database != null && message.hasOwnProperty("database"))
                            object.database = message.database;
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = $root.google.spanner.v1.Session.toObject(message.session, options);
                        return object;
                    };
    
                    /**
                     * Converts this CreateSessionRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateSessionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for CreateSessionRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.CreateSessionRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    CreateSessionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.CreateSessionRequest";
                    };
    
                    return CreateSessionRequest;
                })();
    
                v1.BatchCreateSessionsRequest = (function() {
    
                    /**
                     * Properties of a BatchCreateSessionsRequest.
                     * @memberof google.spanner.v1
                     * @interface IBatchCreateSessionsRequest
                     * @property {string|null} [database] BatchCreateSessionsRequest database
                     * @property {google.spanner.v1.ISession|null} [sessionTemplate] BatchCreateSessionsRequest sessionTemplate
                     * @property {number|null} [sessionCount] BatchCreateSessionsRequest sessionCount
                     */
    
                    /**
                     * Constructs a new BatchCreateSessionsRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a BatchCreateSessionsRequest.
                     * @implements IBatchCreateSessionsRequest
                     * @constructor
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest=} [properties] Properties to set
                     */
                    function BatchCreateSessionsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BatchCreateSessionsRequest database.
                     * @member {string} database
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @instance
                     */
                    BatchCreateSessionsRequest.prototype.database = "";
    
                    /**
                     * BatchCreateSessionsRequest sessionTemplate.
                     * @member {google.spanner.v1.ISession|null|undefined} sessionTemplate
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @instance
                     */
                    BatchCreateSessionsRequest.prototype.sessionTemplate = null;
    
                    /**
                     * BatchCreateSessionsRequest sessionCount.
                     * @member {number} sessionCount
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @instance
                     */
                    BatchCreateSessionsRequest.prototype.sessionCount = 0;
    
                    /**
                     * Creates a new BatchCreateSessionsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.BatchCreateSessionsRequest} BatchCreateSessionsRequest instance
                     */
                    BatchCreateSessionsRequest.create = function create(properties) {
                        return new BatchCreateSessionsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified BatchCreateSessionsRequest message. Does not implicitly {@link google.spanner.v1.BatchCreateSessionsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest} message BatchCreateSessionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchCreateSessionsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                        if (message.sessionTemplate != null && Object.hasOwnProperty.call(message, "sessionTemplate"))
                            $root.google.spanner.v1.Session.encode(message.sessionTemplate, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.sessionCount != null && Object.hasOwnProperty.call(message, "sessionCount"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.sessionCount);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BatchCreateSessionsRequest message, length delimited. Does not implicitly {@link google.spanner.v1.BatchCreateSessionsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsRequest} message BatchCreateSessionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchCreateSessionsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BatchCreateSessionsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.BatchCreateSessionsRequest} BatchCreateSessionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchCreateSessionsRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BatchCreateSessionsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.database = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.sessionTemplate = $root.google.spanner.v1.Session.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.sessionCount = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BatchCreateSessionsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.BatchCreateSessionsRequest} BatchCreateSessionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchCreateSessionsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BatchCreateSessionsRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BatchCreateSessionsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.database != null && message.hasOwnProperty("database"))
                            if (!$util.isString(message.database))
                                return "database: string expected";
                        if (message.sessionTemplate != null && message.hasOwnProperty("sessionTemplate")) {
                            var error = $root.google.spanner.v1.Session.verify(message.sessionTemplate);
                            if (error)
                                return "sessionTemplate." + error;
                        }
                        if (message.sessionCount != null && message.hasOwnProperty("sessionCount"))
                            if (!$util.isInteger(message.sessionCount))
                                return "sessionCount: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a BatchCreateSessionsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.BatchCreateSessionsRequest} BatchCreateSessionsRequest
                     */
                    BatchCreateSessionsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.BatchCreateSessionsRequest)
                            return object;
                        var message = new $root.google.spanner.v1.BatchCreateSessionsRequest();
                        if (object.database != null)
                            message.database = String(object.database);
                        if (object.sessionTemplate != null) {
                            if (typeof object.sessionTemplate !== "object")
                                throw TypeError(".google.spanner.v1.BatchCreateSessionsRequest.sessionTemplate: object expected");
                            message.sessionTemplate = $root.google.spanner.v1.Session.fromObject(object.sessionTemplate);
                        }
                        if (object.sessionCount != null)
                            message.sessionCount = object.sessionCount | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BatchCreateSessionsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {google.spanner.v1.BatchCreateSessionsRequest} message BatchCreateSessionsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BatchCreateSessionsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.database = "";
                            object.sessionTemplate = null;
                            object.sessionCount = 0;
                        }
                        if (message.database != null && message.hasOwnProperty("database"))
                            object.database = message.database;
                        if (message.sessionTemplate != null && message.hasOwnProperty("sessionTemplate"))
                            object.sessionTemplate = $root.google.spanner.v1.Session.toObject(message.sessionTemplate, options);
                        if (message.sessionCount != null && message.hasOwnProperty("sessionCount"))
                            object.sessionCount = message.sessionCount;
                        return object;
                    };
    
                    /**
                     * Converts this BatchCreateSessionsRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BatchCreateSessionsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BatchCreateSessionsRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.BatchCreateSessionsRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BatchCreateSessionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.BatchCreateSessionsRequest";
                    };
    
                    return BatchCreateSessionsRequest;
                })();
    
                v1.BatchCreateSessionsResponse = (function() {
    
                    /**
                     * Properties of a BatchCreateSessionsResponse.
                     * @memberof google.spanner.v1
                     * @interface IBatchCreateSessionsResponse
                     * @property {Array.<google.spanner.v1.ISession>|null} [session] BatchCreateSessionsResponse session
                     */
    
                    /**
                     * Constructs a new BatchCreateSessionsResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a BatchCreateSessionsResponse.
                     * @implements IBatchCreateSessionsResponse
                     * @constructor
                     * @param {google.spanner.v1.IBatchCreateSessionsResponse=} [properties] Properties to set
                     */
                    function BatchCreateSessionsResponse(properties) {
                        this.session = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BatchCreateSessionsResponse session.
                     * @member {Array.<google.spanner.v1.ISession>} session
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @instance
                     */
                    BatchCreateSessionsResponse.prototype.session = $util.emptyArray;
    
                    /**
                     * Creates a new BatchCreateSessionsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.BatchCreateSessionsResponse} BatchCreateSessionsResponse instance
                     */
                    BatchCreateSessionsResponse.create = function create(properties) {
                        return new BatchCreateSessionsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified BatchCreateSessionsResponse message. Does not implicitly {@link google.spanner.v1.BatchCreateSessionsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsResponse} message BatchCreateSessionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchCreateSessionsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && message.session.length)
                            for (var i = 0; i < message.session.length; ++i)
                                $root.google.spanner.v1.Session.encode(message.session[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BatchCreateSessionsResponse message, length delimited. Does not implicitly {@link google.spanner.v1.BatchCreateSessionsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IBatchCreateSessionsResponse} message BatchCreateSessionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchCreateSessionsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BatchCreateSessionsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.BatchCreateSessionsResponse} BatchCreateSessionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchCreateSessionsResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BatchCreateSessionsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.session && message.session.length))
                                        message.session = [];
                                    message.session.push($root.google.spanner.v1.Session.decode(reader, reader.uint32()));
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BatchCreateSessionsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.BatchCreateSessionsResponse} BatchCreateSessionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchCreateSessionsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BatchCreateSessionsResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BatchCreateSessionsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session")) {
                            if (!Array.isArray(message.session))
                                return "session: array expected";
                            for (var i = 0; i < message.session.length; ++i) {
                                var error = $root.google.spanner.v1.Session.verify(message.session[i]);
                                if (error)
                                    return "session." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a BatchCreateSessionsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.BatchCreateSessionsResponse} BatchCreateSessionsResponse
                     */
                    BatchCreateSessionsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.BatchCreateSessionsResponse)
                            return object;
                        var message = new $root.google.spanner.v1.BatchCreateSessionsResponse();
                        if (object.session) {
                            if (!Array.isArray(object.session))
                                throw TypeError(".google.spanner.v1.BatchCreateSessionsResponse.session: array expected");
                            message.session = [];
                            for (var i = 0; i < object.session.length; ++i) {
                                if (typeof object.session[i] !== "object")
                                    throw TypeError(".google.spanner.v1.BatchCreateSessionsResponse.session: object expected");
                                message.session[i] = $root.google.spanner.v1.Session.fromObject(object.session[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BatchCreateSessionsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {google.spanner.v1.BatchCreateSessionsResponse} message BatchCreateSessionsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BatchCreateSessionsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.session = [];
                        if (message.session && message.session.length) {
                            object.session = [];
                            for (var j = 0; j < message.session.length; ++j)
                                object.session[j] = $root.google.spanner.v1.Session.toObject(message.session[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this BatchCreateSessionsResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BatchCreateSessionsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BatchCreateSessionsResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.BatchCreateSessionsResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BatchCreateSessionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.BatchCreateSessionsResponse";
                    };
    
                    return BatchCreateSessionsResponse;
                })();
    
                v1.Session = (function() {
    
                    /**
                     * Properties of a Session.
                     * @memberof google.spanner.v1
                     * @interface ISession
                     * @property {string|null} [name] Session name
                     * @property {Object.<string,string>|null} [labels] Session labels
                     * @property {google.protobuf.ITimestamp|null} [createTime] Session createTime
                     * @property {google.protobuf.ITimestamp|null} [approximateLastUseTime] Session approximateLastUseTime
                     * @property {string|null} [creatorRole] Session creatorRole
                     * @property {boolean|null} [multiplexed] Session multiplexed
                     */
    
                    /**
                     * Constructs a new Session.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Session.
                     * @implements ISession
                     * @constructor
                     * @param {google.spanner.v1.ISession=} [properties] Properties to set
                     */
                    function Session(properties) {
                        this.labels = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Session name.
                     * @member {string} name
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.name = "";
    
                    /**
                     * Session labels.
                     * @member {Object.<string,string>} labels
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.labels = $util.emptyObject;
    
                    /**
                     * Session createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.createTime = null;
    
                    /**
                     * Session approximateLastUseTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} approximateLastUseTime
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.approximateLastUseTime = null;
    
                    /**
                     * Session creatorRole.
                     * @member {string} creatorRole
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.creatorRole = "";
    
                    /**
                     * Session multiplexed.
                     * @member {boolean} multiplexed
                     * @memberof google.spanner.v1.Session
                     * @instance
                     */
                    Session.prototype.multiplexed = false;
    
                    /**
                     * Creates a new Session instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {google.spanner.v1.ISession=} [properties] Properties to set
                     * @returns {google.spanner.v1.Session} Session instance
                     */
                    Session.create = function create(properties) {
                        return new Session(properties);
                    };
    
                    /**
                     * Encodes the specified Session message. Does not implicitly {@link google.spanner.v1.Session.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {google.spanner.v1.ISession} message Session message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Session.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                            for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.approximateLastUseTime != null && Object.hasOwnProperty.call(message, "approximateLastUseTime"))
                            $root.google.protobuf.Timestamp.encode(message.approximateLastUseTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.creatorRole != null && Object.hasOwnProperty.call(message, "creatorRole"))
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.creatorRole);
                        if (message.multiplexed != null && Object.hasOwnProperty.call(message, "multiplexed"))
                            writer.uint32(/* id 6, wireType 0 =*/48).bool(message.multiplexed);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Session message, length delimited. Does not implicitly {@link google.spanner.v1.Session.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {google.spanner.v1.ISession} message Session message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Session.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Session message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.Session} Session
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Session.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Session(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.name = reader.string();
                                    break;
                                }
                            case 2: {
                                    if (message.labels === $util.emptyObject)
                                        message.labels = {};
                                    var end2 = reader.uint32() + reader.pos;
                                    key = "";
                                    value = "";
                                    while (reader.pos < end2) {
                                        var tag2 = reader.uint32();
                                        switch (tag2 >>> 3) {
                                        case 1:
                                            key = reader.string();
                                            break;
                                        case 2:
                                            value = reader.string();
                                            break;
                                        default:
                                            reader.skipType(tag2 & 7);
                                            break;
                                        }
                                    }
                                    message.labels[key] = value;
                                    break;
                                }
                            case 3: {
                                    message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.approximateLastUseTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.creatorRole = reader.string();
                                    break;
                                }
                            case 6: {
                                    message.multiplexed = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Session message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.Session} Session
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Session.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Session message.
                     * @function verify
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Session.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.labels != null && message.hasOwnProperty("labels")) {
                            if (!$util.isObject(message.labels))
                                return "labels: object expected";
                            var key = Object.keys(message.labels);
                            for (var i = 0; i < key.length; ++i)
                                if (!$util.isString(message.labels[key[i]]))
                                    return "labels: string{k:string} expected";
                        }
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.approximateLastUseTime != null && message.hasOwnProperty("approximateLastUseTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.approximateLastUseTime);
                            if (error)
                                return "approximateLastUseTime." + error;
                        }
                        if (message.creatorRole != null && message.hasOwnProperty("creatorRole"))
                            if (!$util.isString(message.creatorRole))
                                return "creatorRole: string expected";
                        if (message.multiplexed != null && message.hasOwnProperty("multiplexed"))
                            if (typeof message.multiplexed !== "boolean")
                                return "multiplexed: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a Session message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.Session} Session
                     */
                    Session.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.Session)
                            return object;
                        var message = new $root.google.spanner.v1.Session();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.labels) {
                            if (typeof object.labels !== "object")
                                throw TypeError(".google.spanner.v1.Session.labels: object expected");
                            message.labels = {};
                            for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                message.labels[keys[i]] = String(object.labels[keys[i]]);
                        }
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.spanner.v1.Session.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.approximateLastUseTime != null) {
                            if (typeof object.approximateLastUseTime !== "object")
                                throw TypeError(".google.spanner.v1.Session.approximateLastUseTime: object expected");
                            message.approximateLastUseTime = $root.google.protobuf.Timestamp.fromObject(object.approximateLastUseTime);
                        }
                        if (object.creatorRole != null)
                            message.creatorRole = String(object.creatorRole);
                        if (object.multiplexed != null)
                            message.multiplexed = Boolean(object.multiplexed);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Session message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {google.spanner.v1.Session} message Session
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Session.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.labels = {};
                        if (options.defaults) {
                            object.name = "";
                            object.createTime = null;
                            object.approximateLastUseTime = null;
                            object.creatorRole = "";
                            object.multiplexed = false;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        var keys2;
                        if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                            object.labels = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.labels[keys2[j]] = message.labels[keys2[j]];
                        }
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.approximateLastUseTime != null && message.hasOwnProperty("approximateLastUseTime"))
                            object.approximateLastUseTime = $root.google.protobuf.Timestamp.toObject(message.approximateLastUseTime, options);
                        if (message.creatorRole != null && message.hasOwnProperty("creatorRole"))
                            object.creatorRole = message.creatorRole;
                        if (message.multiplexed != null && message.hasOwnProperty("multiplexed"))
                            object.multiplexed = message.multiplexed;
                        return object;
                    };
    
                    /**
                     * Converts this Session to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.Session
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Session.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Session
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.Session
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Session.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.Session";
                    };
    
                    return Session;
                })();
    
                v1.GetSessionRequest = (function() {
    
                    /**
                     * Properties of a GetSessionRequest.
                     * @memberof google.spanner.v1
                     * @interface IGetSessionRequest
                     * @property {string|null} [name] GetSessionRequest name
                     */
    
                    /**
                     * Constructs a new GetSessionRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a GetSessionRequest.
                     * @implements IGetSessionRequest
                     * @constructor
                     * @param {google.spanner.v1.IGetSessionRequest=} [properties] Properties to set
                     */
                    function GetSessionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetSessionRequest name.
                     * @member {string} name
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @instance
                     */
                    GetSessionRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetSessionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {google.spanner.v1.IGetSessionRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.GetSessionRequest} GetSessionRequest instance
                     */
                    GetSessionRequest.create = function create(properties) {
                        return new GetSessionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetSessionRequest message. Does not implicitly {@link google.spanner.v1.GetSessionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {google.spanner.v1.IGetSessionRequest} message GetSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSessionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetSessionRequest message, length delimited. Does not implicitly {@link google.spanner.v1.GetSessionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {google.spanner.v1.IGetSessionRequest} message GetSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSessionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetSessionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.GetSessionRequest} GetSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSessionRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.GetSessionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.name = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetSessionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.GetSessionRequest} GetSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSessionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetSessionRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetSessionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetSessionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.GetSessionRequest} GetSessionRequest
                     */
                    GetSessionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.GetSessionRequest)
                            return object;
                        var message = new $root.google.spanner.v1.GetSessionRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetSessionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {google.spanner.v1.GetSessionRequest} message GetSessionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetSessionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetSessionRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetSessionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for GetSessionRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.GetSessionRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    GetSessionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.GetSessionRequest";
                    };
    
                    return GetSessionRequest;
                })();
    
                v1.ListSessionsRequest = (function() {
    
                    /**
                     * Properties of a ListSessionsRequest.
                     * @memberof google.spanner.v1
                     * @interface IListSessionsRequest
                     * @property {string|null} [database] ListSessionsRequest database
                     * @property {number|null} [pageSize] ListSessionsRequest pageSize
                     * @property {string|null} [pageToken] ListSessionsRequest pageToken
                     * @property {string|null} [filter] ListSessionsRequest filter
                     */
    
                    /**
                     * Constructs a new ListSessionsRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ListSessionsRequest.
                     * @implements IListSessionsRequest
                     * @constructor
                     * @param {google.spanner.v1.IListSessionsRequest=} [properties] Properties to set
                     */
                    function ListSessionsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListSessionsRequest database.
                     * @member {string} database
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @instance
                     */
                    ListSessionsRequest.prototype.database = "";
    
                    /**
                     * ListSessionsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @instance
                     */
                    ListSessionsRequest.prototype.pageSize = 0;
    
                    /**
                     * ListSessionsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @instance
                     */
                    ListSessionsRequest.prototype.pageToken = "";
    
                    /**
                     * ListSessionsRequest filter.
                     * @member {string} filter
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @instance
                     */
                    ListSessionsRequest.prototype.filter = "";
    
                    /**
                     * Creates a new ListSessionsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IListSessionsRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.ListSessionsRequest} ListSessionsRequest instance
                     */
                    ListSessionsRequest.create = function create(properties) {
                        return new ListSessionsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListSessionsRequest message. Does not implicitly {@link google.spanner.v1.ListSessionsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IListSessionsRequest} message ListSessionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSessionsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.database != null && Object.hasOwnProperty.call(message, "database"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.database);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.filter);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListSessionsRequest message, length delimited. Does not implicitly {@link google.spanner.v1.ListSessionsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {google.spanner.v1.IListSessionsRequest} message ListSessionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSessionsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListSessionsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ListSessionsRequest} ListSessionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSessionsRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ListSessionsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.database = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.pageSize = reader.int32();
                                    break;
                                }
                            case 3: {
                                    message.pageToken = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.filter = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListSessionsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ListSessionsRequest} ListSessionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSessionsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListSessionsRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListSessionsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.database != null && message.hasOwnProperty("database"))
                            if (!$util.isString(message.database))
                                return "database: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListSessionsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ListSessionsRequest} ListSessionsRequest
                     */
                    ListSessionsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ListSessionsRequest)
                            return object;
                        var message = new $root.google.spanner.v1.ListSessionsRequest();
                        if (object.database != null)
                            message.database = String(object.database);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListSessionsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {google.spanner.v1.ListSessionsRequest} message ListSessionsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListSessionsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.database = "";
                            object.pageSize = 0;
                            object.pageToken = "";
                            object.filter = "";
                        }
                        if (message.database != null && message.hasOwnProperty("database"))
                            object.database = message.database;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        return object;
                    };
    
                    /**
                     * Converts this ListSessionsRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListSessionsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ListSessionsRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ListSessionsRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ListSessionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ListSessionsRequest";
                    };
    
                    return ListSessionsRequest;
                })();
    
                v1.ListSessionsResponse = (function() {
    
                    /**
                     * Properties of a ListSessionsResponse.
                     * @memberof google.spanner.v1
                     * @interface IListSessionsResponse
                     * @property {Array.<google.spanner.v1.ISession>|null} [sessions] ListSessionsResponse sessions
                     * @property {string|null} [nextPageToken] ListSessionsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListSessionsResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ListSessionsResponse.
                     * @implements IListSessionsResponse
                     * @constructor
                     * @param {google.spanner.v1.IListSessionsResponse=} [properties] Properties to set
                     */
                    function ListSessionsResponse(properties) {
                        this.sessions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListSessionsResponse sessions.
                     * @member {Array.<google.spanner.v1.ISession>} sessions
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @instance
                     */
                    ListSessionsResponse.prototype.sessions = $util.emptyArray;
    
                    /**
                     * ListSessionsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @instance
                     */
                    ListSessionsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListSessionsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IListSessionsResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.ListSessionsResponse} ListSessionsResponse instance
                     */
                    ListSessionsResponse.create = function create(properties) {
                        return new ListSessionsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListSessionsResponse message. Does not implicitly {@link google.spanner.v1.ListSessionsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IListSessionsResponse} message ListSessionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSessionsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.sessions != null && message.sessions.length)
                            for (var i = 0; i < message.sessions.length; ++i)
                                $root.google.spanner.v1.Session.encode(message.sessions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListSessionsResponse message, length delimited. Does not implicitly {@link google.spanner.v1.ListSessionsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {google.spanner.v1.IListSessionsResponse} message ListSessionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSessionsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListSessionsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ListSessionsResponse} ListSessionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSessionsResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ListSessionsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.sessions && message.sessions.length))
                                        message.sessions = [];
                                    message.sessions.push($root.google.spanner.v1.Session.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 2: {
                                    message.nextPageToken = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListSessionsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ListSessionsResponse} ListSessionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSessionsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListSessionsResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListSessionsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.sessions != null && message.hasOwnProperty("sessions")) {
                            if (!Array.isArray(message.sessions))
                                return "sessions: array expected";
                            for (var i = 0; i < message.sessions.length; ++i) {
                                var error = $root.google.spanner.v1.Session.verify(message.sessions[i]);
                                if (error)
                                    return "sessions." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListSessionsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ListSessionsResponse} ListSessionsResponse
                     */
                    ListSessionsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ListSessionsResponse)
                            return object;
                        var message = new $root.google.spanner.v1.ListSessionsResponse();
                        if (object.sessions) {
                            if (!Array.isArray(object.sessions))
                                throw TypeError(".google.spanner.v1.ListSessionsResponse.sessions: array expected");
                            message.sessions = [];
                            for (var i = 0; i < object.sessions.length; ++i) {
                                if (typeof object.sessions[i] !== "object")
                                    throw TypeError(".google.spanner.v1.ListSessionsResponse.sessions: object expected");
                                message.sessions[i] = $root.google.spanner.v1.Session.fromObject(object.sessions[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListSessionsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {google.spanner.v1.ListSessionsResponse} message ListSessionsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListSessionsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.sessions = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.sessions && message.sessions.length) {
                            object.sessions = [];
                            for (var j = 0; j < message.sessions.length; ++j)
                                object.sessions[j] = $root.google.spanner.v1.Session.toObject(message.sessions[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListSessionsResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListSessionsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ListSessionsResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ListSessionsResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ListSessionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ListSessionsResponse";
                    };
    
                    return ListSessionsResponse;
                })();
    
                v1.DeleteSessionRequest = (function() {
    
                    /**
                     * Properties of a DeleteSessionRequest.
                     * @memberof google.spanner.v1
                     * @interface IDeleteSessionRequest
                     * @property {string|null} [name] DeleteSessionRequest name
                     */
    
                    /**
                     * Constructs a new DeleteSessionRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a DeleteSessionRequest.
                     * @implements IDeleteSessionRequest
                     * @constructor
                     * @param {google.spanner.v1.IDeleteSessionRequest=} [properties] Properties to set
                     */
                    function DeleteSessionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteSessionRequest name.
                     * @member {string} name
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @instance
                     */
                    DeleteSessionRequest.prototype.name = "";
    
                    /**
                     * Creates a new DeleteSessionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {google.spanner.v1.IDeleteSessionRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.DeleteSessionRequest} DeleteSessionRequest instance
                     */
                    DeleteSessionRequest.create = function create(properties) {
                        return new DeleteSessionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteSessionRequest message. Does not implicitly {@link google.spanner.v1.DeleteSessionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {google.spanner.v1.IDeleteSessionRequest} message DeleteSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteSessionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteSessionRequest message, length delimited. Does not implicitly {@link google.spanner.v1.DeleteSessionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {google.spanner.v1.IDeleteSessionRequest} message DeleteSessionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteSessionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteSessionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.DeleteSessionRequest} DeleteSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteSessionRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.DeleteSessionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.name = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteSessionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.DeleteSessionRequest} DeleteSessionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteSessionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteSessionRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteSessionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteSessionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.DeleteSessionRequest} DeleteSessionRequest
                     */
                    DeleteSessionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.DeleteSessionRequest)
                            return object;
                        var message = new $root.google.spanner.v1.DeleteSessionRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteSessionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {google.spanner.v1.DeleteSessionRequest} message DeleteSessionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteSessionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteSessionRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteSessionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for DeleteSessionRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.DeleteSessionRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    DeleteSessionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.DeleteSessionRequest";
                    };
    
                    return DeleteSessionRequest;
                })();
    
                v1.RequestOptions = (function() {
    
                    /**
                     * Properties of a RequestOptions.
                     * @memberof google.spanner.v1
                     * @interface IRequestOptions
                     * @property {google.spanner.v1.RequestOptions.Priority|null} [priority] RequestOptions priority
                     * @property {string|null} [requestTag] RequestOptions requestTag
                     * @property {string|null} [transactionTag] RequestOptions transactionTag
                     */
    
                    /**
                     * Constructs a new RequestOptions.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a RequestOptions.
                     * @implements IRequestOptions
                     * @constructor
                     * @param {google.spanner.v1.IRequestOptions=} [properties] Properties to set
                     */
                    function RequestOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * RequestOptions priority.
                     * @member {google.spanner.v1.RequestOptions.Priority} priority
                     * @memberof google.spanner.v1.RequestOptions
                     * @instance
                     */
                    RequestOptions.prototype.priority = 0;
    
                    /**
                     * RequestOptions requestTag.
                     * @member {string} requestTag
                     * @memberof google.spanner.v1.RequestOptions
                     * @instance
                     */
                    RequestOptions.prototype.requestTag = "";
    
                    /**
                     * RequestOptions transactionTag.
                     * @member {string} transactionTag
                     * @memberof google.spanner.v1.RequestOptions
                     * @instance
                     */
                    RequestOptions.prototype.transactionTag = "";
    
                    /**
                     * Creates a new RequestOptions instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {google.spanner.v1.IRequestOptions=} [properties] Properties to set
                     * @returns {google.spanner.v1.RequestOptions} RequestOptions instance
                     */
                    RequestOptions.create = function create(properties) {
                        return new RequestOptions(properties);
                    };
    
                    /**
                     * Encodes the specified RequestOptions message. Does not implicitly {@link google.spanner.v1.RequestOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {google.spanner.v1.IRequestOptions} message RequestOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    RequestOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.priority != null && Object.hasOwnProperty.call(message, "priority"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.priority);
                        if (message.requestTag != null && Object.hasOwnProperty.call(message, "requestTag"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.requestTag);
                        if (message.transactionTag != null && Object.hasOwnProperty.call(message, "transactionTag"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.transactionTag);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified RequestOptions message, length delimited. Does not implicitly {@link google.spanner.v1.RequestOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {google.spanner.v1.IRequestOptions} message RequestOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    RequestOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a RequestOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.RequestOptions} RequestOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    RequestOptions.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.RequestOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.priority = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.requestTag = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.transactionTag = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a RequestOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.RequestOptions} RequestOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    RequestOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a RequestOptions message.
                     * @function verify
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    RequestOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.priority != null && message.hasOwnProperty("priority"))
                            switch (message.priority) {
                            default:
                                return "priority: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                                break;
                            }
                        if (message.requestTag != null && message.hasOwnProperty("requestTag"))
                            if (!$util.isString(message.requestTag))
                                return "requestTag: string expected";
                        if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                            if (!$util.isString(message.transactionTag))
                                return "transactionTag: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a RequestOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.RequestOptions} RequestOptions
                     */
                    RequestOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.RequestOptions)
                            return object;
                        var message = new $root.google.spanner.v1.RequestOptions();
                        switch (object.priority) {
                        default:
                            if (typeof object.priority === "number") {
                                message.priority = object.priority;
                                break;
                            }
                            break;
                        case "PRIORITY_UNSPECIFIED":
                        case 0:
                            message.priority = 0;
                            break;
                        case "PRIORITY_LOW":
                        case 1:
                            message.priority = 1;
                            break;
                        case "PRIORITY_MEDIUM":
                        case 2:
                            message.priority = 2;
                            break;
                        case "PRIORITY_HIGH":
                        case 3:
                            message.priority = 3;
                            break;
                        }
                        if (object.requestTag != null)
                            message.requestTag = String(object.requestTag);
                        if (object.transactionTag != null)
                            message.transactionTag = String(object.transactionTag);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a RequestOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {google.spanner.v1.RequestOptions} message RequestOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    RequestOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.priority = options.enums === String ? "PRIORITY_UNSPECIFIED" : 0;
                            object.requestTag = "";
                            object.transactionTag = "";
                        }
                        if (message.priority != null && message.hasOwnProperty("priority"))
                            object.priority = options.enums === String ? $root.google.spanner.v1.RequestOptions.Priority[message.priority] === undefined ? message.priority : $root.google.spanner.v1.RequestOptions.Priority[message.priority] : message.priority;
                        if (message.requestTag != null && message.hasOwnProperty("requestTag"))
                            object.requestTag = message.requestTag;
                        if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                            object.transactionTag = message.transactionTag;
                        return object;
                    };
    
                    /**
                     * Converts this RequestOptions to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.RequestOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    RequestOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for RequestOptions
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.RequestOptions
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    RequestOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.RequestOptions";
                    };
    
                    /**
                     * Priority enum.
                     * @name google.spanner.v1.RequestOptions.Priority
                     * @enum {number}
                     * @property {number} PRIORITY_UNSPECIFIED=0 PRIORITY_UNSPECIFIED value
                     * @property {number} PRIORITY_LOW=1 PRIORITY_LOW value
                     * @property {number} PRIORITY_MEDIUM=2 PRIORITY_MEDIUM value
                     * @property {number} PRIORITY_HIGH=3 PRIORITY_HIGH value
                     */
                    RequestOptions.Priority = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "PRIORITY_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "PRIORITY_LOW"] = 1;
                        values[valuesById[2] = "PRIORITY_MEDIUM"] = 2;
                        values[valuesById[3] = "PRIORITY_HIGH"] = 3;
                        return values;
                    })();
    
                    return RequestOptions;
                })();
    
                v1.DirectedReadOptions = (function() {
    
                    /**
                     * Properties of a DirectedReadOptions.
                     * @memberof google.spanner.v1
                     * @interface IDirectedReadOptions
                     * @property {google.spanner.v1.DirectedReadOptions.IIncludeReplicas|null} [includeReplicas] DirectedReadOptions includeReplicas
                     * @property {google.spanner.v1.DirectedReadOptions.IExcludeReplicas|null} [excludeReplicas] DirectedReadOptions excludeReplicas
                     */
    
                    /**
                     * Constructs a new DirectedReadOptions.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a DirectedReadOptions.
                     * @implements IDirectedReadOptions
                     * @constructor
                     * @param {google.spanner.v1.IDirectedReadOptions=} [properties] Properties to set
                     */
                    function DirectedReadOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DirectedReadOptions includeReplicas.
                     * @member {google.spanner.v1.DirectedReadOptions.IIncludeReplicas|null|undefined} includeReplicas
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @instance
                     */
                    DirectedReadOptions.prototype.includeReplicas = null;
    
                    /**
                     * DirectedReadOptions excludeReplicas.
                     * @member {google.spanner.v1.DirectedReadOptions.IExcludeReplicas|null|undefined} excludeReplicas
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @instance
                     */
                    DirectedReadOptions.prototype.excludeReplicas = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * DirectedReadOptions replicas.
                     * @member {"includeReplicas"|"excludeReplicas"|undefined} replicas
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @instance
                     */
                    Object.defineProperty(DirectedReadOptions.prototype, "replicas", {
                        get: $util.oneOfGetter($oneOfFields = ["includeReplicas", "excludeReplicas"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new DirectedReadOptions instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {google.spanner.v1.IDirectedReadOptions=} [properties] Properties to set
                     * @returns {google.spanner.v1.DirectedReadOptions} DirectedReadOptions instance
                     */
                    DirectedReadOptions.create = function create(properties) {
                        return new DirectedReadOptions(properties);
                    };
    
                    /**
                     * Encodes the specified DirectedReadOptions message. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {google.spanner.v1.IDirectedReadOptions} message DirectedReadOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DirectedReadOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.includeReplicas != null && Object.hasOwnProperty.call(message, "includeReplicas"))
                            $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas.encode(message.includeReplicas, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.excludeReplicas != null && Object.hasOwnProperty.call(message, "excludeReplicas"))
                            $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas.encode(message.excludeReplicas, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DirectedReadOptions message, length delimited. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {google.spanner.v1.IDirectedReadOptions} message DirectedReadOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DirectedReadOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DirectedReadOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.DirectedReadOptions} DirectedReadOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DirectedReadOptions.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.DirectedReadOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.includeReplicas = $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.excludeReplicas = $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DirectedReadOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.DirectedReadOptions} DirectedReadOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DirectedReadOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DirectedReadOptions message.
                     * @function verify
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DirectedReadOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.includeReplicas != null && message.hasOwnProperty("includeReplicas")) {
                            properties.replicas = 1;
                            {
                                var error = $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas.verify(message.includeReplicas);
                                if (error)
                                    return "includeReplicas." + error;
                            }
                        }
                        if (message.excludeReplicas != null && message.hasOwnProperty("excludeReplicas")) {
                            if (properties.replicas === 1)
                                return "replicas: multiple values";
                            properties.replicas = 1;
                            {
                                var error = $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas.verify(message.excludeReplicas);
                                if (error)
                                    return "excludeReplicas." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a DirectedReadOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.DirectedReadOptions} DirectedReadOptions
                     */
                    DirectedReadOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.DirectedReadOptions)
                            return object;
                        var message = new $root.google.spanner.v1.DirectedReadOptions();
                        if (object.includeReplicas != null) {
                            if (typeof object.includeReplicas !== "object")
                                throw TypeError(".google.spanner.v1.DirectedReadOptions.includeReplicas: object expected");
                            message.includeReplicas = $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas.fromObject(object.includeReplicas);
                        }
                        if (object.excludeReplicas != null) {
                            if (typeof object.excludeReplicas !== "object")
                                throw TypeError(".google.spanner.v1.DirectedReadOptions.excludeReplicas: object expected");
                            message.excludeReplicas = $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas.fromObject(object.excludeReplicas);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DirectedReadOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {google.spanner.v1.DirectedReadOptions} message DirectedReadOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DirectedReadOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.includeReplicas != null && message.hasOwnProperty("includeReplicas")) {
                            object.includeReplicas = $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas.toObject(message.includeReplicas, options);
                            if (options.oneofs)
                                object.replicas = "includeReplicas";
                        }
                        if (message.excludeReplicas != null && message.hasOwnProperty("excludeReplicas")) {
                            object.excludeReplicas = $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas.toObject(message.excludeReplicas, options);
                            if (options.oneofs)
                                object.replicas = "excludeReplicas";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this DirectedReadOptions to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DirectedReadOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for DirectedReadOptions
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.DirectedReadOptions
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    DirectedReadOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.DirectedReadOptions";
                    };
    
                    DirectedReadOptions.ReplicaSelection = (function() {
    
                        /**
                         * Properties of a ReplicaSelection.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @interface IReplicaSelection
                         * @property {string|null} [location] ReplicaSelection location
                         * @property {google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type|null} [type] ReplicaSelection type
                         */
    
                        /**
                         * Constructs a new ReplicaSelection.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @classdesc Represents a ReplicaSelection.
                         * @implements IReplicaSelection
                         * @constructor
                         * @param {google.spanner.v1.DirectedReadOptions.IReplicaSelection=} [properties] Properties to set
                         */
                        function ReplicaSelection(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ReplicaSelection location.
                         * @member {string} location
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @instance
                         */
                        ReplicaSelection.prototype.location = "";
    
                        /**
                         * ReplicaSelection type.
                         * @member {google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type} type
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @instance
                         */
                        ReplicaSelection.prototype.type = 0;
    
                        /**
                         * Creates a new ReplicaSelection instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IReplicaSelection=} [properties] Properties to set
                         * @returns {google.spanner.v1.DirectedReadOptions.ReplicaSelection} ReplicaSelection instance
                         */
                        ReplicaSelection.create = function create(properties) {
                            return new ReplicaSelection(properties);
                        };
    
                        /**
                         * Encodes the specified ReplicaSelection message. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.ReplicaSelection.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IReplicaSelection} message ReplicaSelection message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReplicaSelection.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.location);
                            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ReplicaSelection message, length delimited. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.ReplicaSelection.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IReplicaSelection} message ReplicaSelection message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReplicaSelection.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ReplicaSelection message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.DirectedReadOptions.ReplicaSelection} ReplicaSelection
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReplicaSelection.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.location = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.type = reader.int32();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ReplicaSelection message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.DirectedReadOptions.ReplicaSelection} ReplicaSelection
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReplicaSelection.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ReplicaSelection message.
                         * @function verify
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ReplicaSelection.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.location != null && message.hasOwnProperty("location"))
                                if (!$util.isString(message.location))
                                    return "location: string expected";
                            if (message.type != null && message.hasOwnProperty("type"))
                                switch (message.type) {
                                default:
                                    return "type: enum value expected";
                                case 0:
                                case 1:
                                case 2:
                                    break;
                                }
                            return null;
                        };
    
                        /**
                         * Creates a ReplicaSelection message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.DirectedReadOptions.ReplicaSelection} ReplicaSelection
                         */
                        ReplicaSelection.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection)
                                return object;
                            var message = new $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection();
                            if (object.location != null)
                                message.location = String(object.location);
                            switch (object.type) {
                            default:
                                if (typeof object.type === "number") {
                                    message.type = object.type;
                                    break;
                                }
                                break;
                            case "TYPE_UNSPECIFIED":
                            case 0:
                                message.type = 0;
                                break;
                            case "READ_WRITE":
                            case 1:
                                message.type = 1;
                                break;
                            case "READ_ONLY":
                            case 2:
                                message.type = 2;
                                break;
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ReplicaSelection message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.ReplicaSelection} message ReplicaSelection
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ReplicaSelection.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.location = "";
                                object.type = options.enums === String ? "TYPE_UNSPECIFIED" : 0;
                            }
                            if (message.location != null && message.hasOwnProperty("location"))
                                object.location = message.location;
                            if (message.type != null && message.hasOwnProperty("type"))
                                object.type = options.enums === String ? $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type[message.type] === undefined ? message.type : $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type[message.type] : message.type;
                            return object;
                        };
    
                        /**
                         * Converts this ReplicaSelection to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ReplicaSelection.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ReplicaSelection
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.DirectedReadOptions.ReplicaSelection
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ReplicaSelection.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.DirectedReadOptions.ReplicaSelection";
                        };
    
                        /**
                         * Type enum.
                         * @name google.spanner.v1.DirectedReadOptions.ReplicaSelection.Type
                         * @enum {number}
                         * @property {number} TYPE_UNSPECIFIED=0 TYPE_UNSPECIFIED value
                         * @property {number} READ_WRITE=1 READ_WRITE value
                         * @property {number} READ_ONLY=2 READ_ONLY value
                         */
                        ReplicaSelection.Type = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "TYPE_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "READ_WRITE"] = 1;
                            values[valuesById[2] = "READ_ONLY"] = 2;
                            return values;
                        })();
    
                        return ReplicaSelection;
                    })();
    
                    DirectedReadOptions.IncludeReplicas = (function() {
    
                        /**
                         * Properties of an IncludeReplicas.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @interface IIncludeReplicas
                         * @property {Array.<google.spanner.v1.DirectedReadOptions.IReplicaSelection>|null} [replicaSelections] IncludeReplicas replicaSelections
                         * @property {boolean|null} [autoFailoverDisabled] IncludeReplicas autoFailoverDisabled
                         */
    
                        /**
                         * Constructs a new IncludeReplicas.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @classdesc Represents an IncludeReplicas.
                         * @implements IIncludeReplicas
                         * @constructor
                         * @param {google.spanner.v1.DirectedReadOptions.IIncludeReplicas=} [properties] Properties to set
                         */
                        function IncludeReplicas(properties) {
                            this.replicaSelections = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * IncludeReplicas replicaSelections.
                         * @member {Array.<google.spanner.v1.DirectedReadOptions.IReplicaSelection>} replicaSelections
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @instance
                         */
                        IncludeReplicas.prototype.replicaSelections = $util.emptyArray;
    
                        /**
                         * IncludeReplicas autoFailoverDisabled.
                         * @member {boolean} autoFailoverDisabled
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @instance
                         */
                        IncludeReplicas.prototype.autoFailoverDisabled = false;
    
                        /**
                         * Creates a new IncludeReplicas instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IIncludeReplicas=} [properties] Properties to set
                         * @returns {google.spanner.v1.DirectedReadOptions.IncludeReplicas} IncludeReplicas instance
                         */
                        IncludeReplicas.create = function create(properties) {
                            return new IncludeReplicas(properties);
                        };
    
                        /**
                         * Encodes the specified IncludeReplicas message. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.IncludeReplicas.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IIncludeReplicas} message IncludeReplicas message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        IncludeReplicas.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.replicaSelections != null && message.replicaSelections.length)
                                for (var i = 0; i < message.replicaSelections.length; ++i)
                                    $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.encode(message.replicaSelections[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.autoFailoverDisabled != null && Object.hasOwnProperty.call(message, "autoFailoverDisabled"))
                                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.autoFailoverDisabled);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified IncludeReplicas message, length delimited. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.IncludeReplicas.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IIncludeReplicas} message IncludeReplicas message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        IncludeReplicas.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an IncludeReplicas message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.DirectedReadOptions.IncludeReplicas} IncludeReplicas
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        IncludeReplicas.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.replicaSelections && message.replicaSelections.length))
                                            message.replicaSelections = [];
                                        message.replicaSelections.push($root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 2: {
                                        message.autoFailoverDisabled = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an IncludeReplicas message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.DirectedReadOptions.IncludeReplicas} IncludeReplicas
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        IncludeReplicas.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an IncludeReplicas message.
                         * @function verify
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        IncludeReplicas.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.replicaSelections != null && message.hasOwnProperty("replicaSelections")) {
                                if (!Array.isArray(message.replicaSelections))
                                    return "replicaSelections: array expected";
                                for (var i = 0; i < message.replicaSelections.length; ++i) {
                                    var error = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.verify(message.replicaSelections[i]);
                                    if (error)
                                        return "replicaSelections." + error;
                                }
                            }
                            if (message.autoFailoverDisabled != null && message.hasOwnProperty("autoFailoverDisabled"))
                                if (typeof message.autoFailoverDisabled !== "boolean")
                                    return "autoFailoverDisabled: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates an IncludeReplicas message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.DirectedReadOptions.IncludeReplicas} IncludeReplicas
                         */
                        IncludeReplicas.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas)
                                return object;
                            var message = new $root.google.spanner.v1.DirectedReadOptions.IncludeReplicas();
                            if (object.replicaSelections) {
                                if (!Array.isArray(object.replicaSelections))
                                    throw TypeError(".google.spanner.v1.DirectedReadOptions.IncludeReplicas.replicaSelections: array expected");
                                message.replicaSelections = [];
                                for (var i = 0; i < object.replicaSelections.length; ++i) {
                                    if (typeof object.replicaSelections[i] !== "object")
                                        throw TypeError(".google.spanner.v1.DirectedReadOptions.IncludeReplicas.replicaSelections: object expected");
                                    message.replicaSelections[i] = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.fromObject(object.replicaSelections[i]);
                                }
                            }
                            if (object.autoFailoverDisabled != null)
                                message.autoFailoverDisabled = Boolean(object.autoFailoverDisabled);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an IncludeReplicas message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IncludeReplicas} message IncludeReplicas
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        IncludeReplicas.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.replicaSelections = [];
                            if (options.defaults)
                                object.autoFailoverDisabled = false;
                            if (message.replicaSelections && message.replicaSelections.length) {
                                object.replicaSelections = [];
                                for (var j = 0; j < message.replicaSelections.length; ++j)
                                    object.replicaSelections[j] = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.toObject(message.replicaSelections[j], options);
                            }
                            if (message.autoFailoverDisabled != null && message.hasOwnProperty("autoFailoverDisabled"))
                                object.autoFailoverDisabled = message.autoFailoverDisabled;
                            return object;
                        };
    
                        /**
                         * Converts this IncludeReplicas to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        IncludeReplicas.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for IncludeReplicas
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.DirectedReadOptions.IncludeReplicas
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        IncludeReplicas.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.DirectedReadOptions.IncludeReplicas";
                        };
    
                        return IncludeReplicas;
                    })();
    
                    DirectedReadOptions.ExcludeReplicas = (function() {
    
                        /**
                         * Properties of an ExcludeReplicas.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @interface IExcludeReplicas
                         * @property {Array.<google.spanner.v1.DirectedReadOptions.IReplicaSelection>|null} [replicaSelections] ExcludeReplicas replicaSelections
                         */
    
                        /**
                         * Constructs a new ExcludeReplicas.
                         * @memberof google.spanner.v1.DirectedReadOptions
                         * @classdesc Represents an ExcludeReplicas.
                         * @implements IExcludeReplicas
                         * @constructor
                         * @param {google.spanner.v1.DirectedReadOptions.IExcludeReplicas=} [properties] Properties to set
                         */
                        function ExcludeReplicas(properties) {
                            this.replicaSelections = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ExcludeReplicas replicaSelections.
                         * @member {Array.<google.spanner.v1.DirectedReadOptions.IReplicaSelection>} replicaSelections
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @instance
                         */
                        ExcludeReplicas.prototype.replicaSelections = $util.emptyArray;
    
                        /**
                         * Creates a new ExcludeReplicas instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IExcludeReplicas=} [properties] Properties to set
                         * @returns {google.spanner.v1.DirectedReadOptions.ExcludeReplicas} ExcludeReplicas instance
                         */
                        ExcludeReplicas.create = function create(properties) {
                            return new ExcludeReplicas(properties);
                        };
    
                        /**
                         * Encodes the specified ExcludeReplicas message. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.ExcludeReplicas.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IExcludeReplicas} message ExcludeReplicas message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExcludeReplicas.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.replicaSelections != null && message.replicaSelections.length)
                                for (var i = 0; i < message.replicaSelections.length; ++i)
                                    $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.encode(message.replicaSelections[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ExcludeReplicas message, length delimited. Does not implicitly {@link google.spanner.v1.DirectedReadOptions.ExcludeReplicas.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.IExcludeReplicas} message ExcludeReplicas message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ExcludeReplicas.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an ExcludeReplicas message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.DirectedReadOptions.ExcludeReplicas} ExcludeReplicas
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExcludeReplicas.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.replicaSelections && message.replicaSelections.length))
                                            message.replicaSelections = [];
                                        message.replicaSelections.push($root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an ExcludeReplicas message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.DirectedReadOptions.ExcludeReplicas} ExcludeReplicas
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ExcludeReplicas.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an ExcludeReplicas message.
                         * @function verify
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ExcludeReplicas.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.replicaSelections != null && message.hasOwnProperty("replicaSelections")) {
                                if (!Array.isArray(message.replicaSelections))
                                    return "replicaSelections: array expected";
                                for (var i = 0; i < message.replicaSelections.length; ++i) {
                                    var error = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.verify(message.replicaSelections[i]);
                                    if (error)
                                        return "replicaSelections." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates an ExcludeReplicas message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.DirectedReadOptions.ExcludeReplicas} ExcludeReplicas
                         */
                        ExcludeReplicas.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas)
                                return object;
                            var message = new $root.google.spanner.v1.DirectedReadOptions.ExcludeReplicas();
                            if (object.replicaSelections) {
                                if (!Array.isArray(object.replicaSelections))
                                    throw TypeError(".google.spanner.v1.DirectedReadOptions.ExcludeReplicas.replicaSelections: array expected");
                                message.replicaSelections = [];
                                for (var i = 0; i < object.replicaSelections.length; ++i) {
                                    if (typeof object.replicaSelections[i] !== "object")
                                        throw TypeError(".google.spanner.v1.DirectedReadOptions.ExcludeReplicas.replicaSelections: object expected");
                                    message.replicaSelections[i] = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.fromObject(object.replicaSelections[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an ExcludeReplicas message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {google.spanner.v1.DirectedReadOptions.ExcludeReplicas} message ExcludeReplicas
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ExcludeReplicas.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.replicaSelections = [];
                            if (message.replicaSelections && message.replicaSelections.length) {
                                object.replicaSelections = [];
                                for (var j = 0; j < message.replicaSelections.length; ++j)
                                    object.replicaSelections[j] = $root.google.spanner.v1.DirectedReadOptions.ReplicaSelection.toObject(message.replicaSelections[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ExcludeReplicas to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ExcludeReplicas.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ExcludeReplicas
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.DirectedReadOptions.ExcludeReplicas
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ExcludeReplicas.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.DirectedReadOptions.ExcludeReplicas";
                        };
    
                        return ExcludeReplicas;
                    })();
    
                    return DirectedReadOptions;
                })();
    
                v1.ExecuteSqlRequest = (function() {
    
                    /**
                     * Properties of an ExecuteSqlRequest.
                     * @memberof google.spanner.v1
                     * @interface IExecuteSqlRequest
                     * @property {string|null} [session] ExecuteSqlRequest session
                     * @property {google.spanner.v1.ITransactionSelector|null} [transaction] ExecuteSqlRequest transaction
                     * @property {string|null} [sql] ExecuteSqlRequest sql
                     * @property {google.protobuf.IStruct|null} [params] ExecuteSqlRequest params
                     * @property {Object.<string,google.spanner.v1.IType>|null} [paramTypes] ExecuteSqlRequest paramTypes
                     * @property {Uint8Array|null} [resumeToken] ExecuteSqlRequest resumeToken
                     * @property {google.spanner.v1.ExecuteSqlRequest.QueryMode|null} [queryMode] ExecuteSqlRequest queryMode
                     * @property {Uint8Array|null} [partitionToken] ExecuteSqlRequest partitionToken
                     * @property {number|Long|null} [seqno] ExecuteSqlRequest seqno
                     * @property {google.spanner.v1.ExecuteSqlRequest.IQueryOptions|null} [queryOptions] ExecuteSqlRequest queryOptions
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] ExecuteSqlRequest requestOptions
                     * @property {google.spanner.v1.IDirectedReadOptions|null} [directedReadOptions] ExecuteSqlRequest directedReadOptions
                     * @property {boolean|null} [dataBoostEnabled] ExecuteSqlRequest dataBoostEnabled
                     * @property {boolean|null} [lastStatement] ExecuteSqlRequest lastStatement
                     */
    
                    /**
                     * Constructs a new ExecuteSqlRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents an ExecuteSqlRequest.
                     * @implements IExecuteSqlRequest
                     * @constructor
                     * @param {google.spanner.v1.IExecuteSqlRequest=} [properties] Properties to set
                     */
                    function ExecuteSqlRequest(properties) {
                        this.paramTypes = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExecuteSqlRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.session = "";
    
                    /**
                     * ExecuteSqlRequest transaction.
                     * @member {google.spanner.v1.ITransactionSelector|null|undefined} transaction
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.transaction = null;
    
                    /**
                     * ExecuteSqlRequest sql.
                     * @member {string} sql
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.sql = "";
    
                    /**
                     * ExecuteSqlRequest params.
                     * @member {google.protobuf.IStruct|null|undefined} params
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.params = null;
    
                    /**
                     * ExecuteSqlRequest paramTypes.
                     * @member {Object.<string,google.spanner.v1.IType>} paramTypes
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.paramTypes = $util.emptyObject;
    
                    /**
                     * ExecuteSqlRequest resumeToken.
                     * @member {Uint8Array} resumeToken
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.resumeToken = $util.newBuffer([]);
    
                    /**
                     * ExecuteSqlRequest queryMode.
                     * @member {google.spanner.v1.ExecuteSqlRequest.QueryMode} queryMode
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.queryMode = 0;
    
                    /**
                     * ExecuteSqlRequest partitionToken.
                     * @member {Uint8Array} partitionToken
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.partitionToken = $util.newBuffer([]);
    
                    /**
                     * ExecuteSqlRequest seqno.
                     * @member {number|Long} seqno
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.seqno = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * ExecuteSqlRequest queryOptions.
                     * @member {google.spanner.v1.ExecuteSqlRequest.IQueryOptions|null|undefined} queryOptions
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.queryOptions = null;
    
                    /**
                     * ExecuteSqlRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.requestOptions = null;
    
                    /**
                     * ExecuteSqlRequest directedReadOptions.
                     * @member {google.spanner.v1.IDirectedReadOptions|null|undefined} directedReadOptions
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.directedReadOptions = null;
    
                    /**
                     * ExecuteSqlRequest dataBoostEnabled.
                     * @member {boolean} dataBoostEnabled
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.dataBoostEnabled = false;
    
                    /**
                     * ExecuteSqlRequest lastStatement.
                     * @member {boolean} lastStatement
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     */
                    ExecuteSqlRequest.prototype.lastStatement = false;
    
                    /**
                     * Creates a new ExecuteSqlRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteSqlRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.ExecuteSqlRequest} ExecuteSqlRequest instance
                     */
                    ExecuteSqlRequest.create = function create(properties) {
                        return new ExecuteSqlRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ExecuteSqlRequest message. Does not implicitly {@link google.spanner.v1.ExecuteSqlRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteSqlRequest} message ExecuteSqlRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteSqlRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.TransactionSelector.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.sql != null && Object.hasOwnProperty.call(message, "sql"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.sql);
                        if (message.params != null && Object.hasOwnProperty.call(message, "params"))
                            $root.google.protobuf.Struct.encode(message.params, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.paramTypes != null && Object.hasOwnProperty.call(message, "paramTypes"))
                            for (var keys = Object.keys(message.paramTypes), i = 0; i < keys.length; ++i) {
                                writer.uint32(/* id 5, wireType 2 =*/42).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);
                                $root.google.spanner.v1.Type.encode(message.paramTypes[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                            }
                        if (message.resumeToken != null && Object.hasOwnProperty.call(message, "resumeToken"))
                            writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.resumeToken);
                        if (message.queryMode != null && Object.hasOwnProperty.call(message, "queryMode"))
                            writer.uint32(/* id 7, wireType 0 =*/56).int32(message.queryMode);
                        if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                            writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.partitionToken);
                        if (message.seqno != null && Object.hasOwnProperty.call(message, "seqno"))
                            writer.uint32(/* id 9, wireType 0 =*/72).int64(message.seqno);
                        if (message.queryOptions != null && Object.hasOwnProperty.call(message, "queryOptions"))
                            $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions.encode(message.queryOptions, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                        if (message.directedReadOptions != null && Object.hasOwnProperty.call(message, "directedReadOptions"))
                            $root.google.spanner.v1.DirectedReadOptions.encode(message.directedReadOptions, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();
                        if (message.dataBoostEnabled != null && Object.hasOwnProperty.call(message, "dataBoostEnabled"))
                            writer.uint32(/* id 16, wireType 0 =*/128).bool(message.dataBoostEnabled);
                        if (message.lastStatement != null && Object.hasOwnProperty.call(message, "lastStatement"))
                            writer.uint32(/* id 17, wireType 0 =*/136).bool(message.lastStatement);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExecuteSqlRequest message, length delimited. Does not implicitly {@link google.spanner.v1.ExecuteSqlRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteSqlRequest} message ExecuteSqlRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteSqlRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExecuteSqlRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ExecuteSqlRequest} ExecuteSqlRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteSqlRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ExecuteSqlRequest(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.TransactionSelector.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.sql = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.params = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    if (message.paramTypes === $util.emptyObject)
                                        message.paramTypes = {};
                                    var end2 = reader.uint32() + reader.pos;
                                    key = "";
                                    value = null;
                                    while (reader.pos < end2) {
                                        var tag2 = reader.uint32();
                                        switch (tag2 >>> 3) {
                                        case 1:
                                            key = reader.string();
                                            break;
                                        case 2:
                                            value = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                            break;
                                        default:
                                            reader.skipType(tag2 & 7);
                                            break;
                                        }
                                    }
                                    message.paramTypes[key] = value;
                                    break;
                                }
                            case 6: {
                                    message.resumeToken = reader.bytes();
                                    break;
                                }
                            case 7: {
                                    message.queryMode = reader.int32();
                                    break;
                                }
                            case 8: {
                                    message.partitionToken = reader.bytes();
                                    break;
                                }
                            case 9: {
                                    message.seqno = reader.int64();
                                    break;
                                }
                            case 10: {
                                    message.queryOptions = $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 11: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 15: {
                                    message.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 16: {
                                    message.dataBoostEnabled = reader.bool();
                                    break;
                                }
                            case 17: {
                                    message.lastStatement = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExecuteSqlRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ExecuteSqlRequest} ExecuteSqlRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteSqlRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExecuteSqlRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExecuteSqlRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.TransactionSelector.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.sql != null && message.hasOwnProperty("sql"))
                            if (!$util.isString(message.sql))
                                return "sql: string expected";
                        if (message.params != null && message.hasOwnProperty("params")) {
                            var error = $root.google.protobuf.Struct.verify(message.params);
                            if (error)
                                return "params." + error;
                        }
                        if (message.paramTypes != null && message.hasOwnProperty("paramTypes")) {
                            if (!$util.isObject(message.paramTypes))
                                return "paramTypes: object expected";
                            var key = Object.keys(message.paramTypes);
                            for (var i = 0; i < key.length; ++i) {
                                var error = $root.google.spanner.v1.Type.verify(message.paramTypes[key[i]]);
                                if (error)
                                    return "paramTypes." + error;
                            }
                        }
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            if (!(message.resumeToken && typeof message.resumeToken.length === "number" || $util.isString(message.resumeToken)))
                                return "resumeToken: buffer expected";
                        if (message.queryMode != null && message.hasOwnProperty("queryMode"))
                            switch (message.queryMode) {
                            default:
                                return "queryMode: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                                break;
                            }
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            if (!(message.partitionToken && typeof message.partitionToken.length === "number" || $util.isString(message.partitionToken)))
                                return "partitionToken: buffer expected";
                        if (message.seqno != null && message.hasOwnProperty("seqno"))
                            if (!$util.isInteger(message.seqno) && !(message.seqno && $util.isInteger(message.seqno.low) && $util.isInteger(message.seqno.high)))
                                return "seqno: integer|Long expected";
                        if (message.queryOptions != null && message.hasOwnProperty("queryOptions")) {
                            var error = $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions.verify(message.queryOptions);
                            if (error)
                                return "queryOptions." + error;
                        }
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.directedReadOptions != null && message.hasOwnProperty("directedReadOptions")) {
                            var error = $root.google.spanner.v1.DirectedReadOptions.verify(message.directedReadOptions);
                            if (error)
                                return "directedReadOptions." + error;
                        }
                        if (message.dataBoostEnabled != null && message.hasOwnProperty("dataBoostEnabled"))
                            if (typeof message.dataBoostEnabled !== "boolean")
                                return "dataBoostEnabled: boolean expected";
                        if (message.lastStatement != null && message.hasOwnProperty("lastStatement"))
                            if (typeof message.lastStatement !== "boolean")
                                return "lastStatement: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates an ExecuteSqlRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ExecuteSqlRequest} ExecuteSqlRequest
                     */
                    ExecuteSqlRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ExecuteSqlRequest)
                            return object;
                        var message = new $root.google.spanner.v1.ExecuteSqlRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.TransactionSelector.fromObject(object.transaction);
                        }
                        if (object.sql != null)
                            message.sql = String(object.sql);
                        if (object.params != null) {
                            if (typeof object.params !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.params: object expected");
                            message.params = $root.google.protobuf.Struct.fromObject(object.params);
                        }
                        if (object.paramTypes) {
                            if (typeof object.paramTypes !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.paramTypes: object expected");
                            message.paramTypes = {};
                            for (var keys = Object.keys(object.paramTypes), i = 0; i < keys.length; ++i) {
                                if (typeof object.paramTypes[keys[i]] !== "object")
                                    throw TypeError(".google.spanner.v1.ExecuteSqlRequest.paramTypes: object expected");
                                message.paramTypes[keys[i]] = $root.google.spanner.v1.Type.fromObject(object.paramTypes[keys[i]]);
                            }
                        }
                        if (object.resumeToken != null)
                            if (typeof object.resumeToken === "string")
                                $util.base64.decode(object.resumeToken, message.resumeToken = $util.newBuffer($util.base64.length(object.resumeToken)), 0);
                            else if (object.resumeToken.length >= 0)
                                message.resumeToken = object.resumeToken;
                        switch (object.queryMode) {
                        default:
                            if (typeof object.queryMode === "number") {
                                message.queryMode = object.queryMode;
                                break;
                            }
                            break;
                        case "NORMAL":
                        case 0:
                            message.queryMode = 0;
                            break;
                        case "PLAN":
                        case 1:
                            message.queryMode = 1;
                            break;
                        case "PROFILE":
                        case 2:
                            message.queryMode = 2;
                            break;
                        case "WITH_STATS":
                        case 3:
                            message.queryMode = 3;
                            break;
                        case "WITH_PLAN_AND_STATS":
                        case 4:
                            message.queryMode = 4;
                            break;
                        }
                        if (object.partitionToken != null)
                            if (typeof object.partitionToken === "string")
                                $util.base64.decode(object.partitionToken, message.partitionToken = $util.newBuffer($util.base64.length(object.partitionToken)), 0);
                            else if (object.partitionToken.length >= 0)
                                message.partitionToken = object.partitionToken;
                        if (object.seqno != null)
                            if ($util.Long)
                                (message.seqno = $util.Long.fromValue(object.seqno)).unsigned = false;
                            else if (typeof object.seqno === "string")
                                message.seqno = parseInt(object.seqno, 10);
                            else if (typeof object.seqno === "number")
                                message.seqno = object.seqno;
                            else if (typeof object.seqno === "object")
                                message.seqno = new $util.LongBits(object.seqno.low >>> 0, object.seqno.high >>> 0).toNumber();
                        if (object.queryOptions != null) {
                            if (typeof object.queryOptions !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.queryOptions: object expected");
                            message.queryOptions = $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions.fromObject(object.queryOptions);
                        }
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.directedReadOptions != null) {
                            if (typeof object.directedReadOptions !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteSqlRequest.directedReadOptions: object expected");
                            message.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.fromObject(object.directedReadOptions);
                        }
                        if (object.dataBoostEnabled != null)
                            message.dataBoostEnabled = Boolean(object.dataBoostEnabled);
                        if (object.lastStatement != null)
                            message.lastStatement = Boolean(object.lastStatement);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExecuteSqlRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {google.spanner.v1.ExecuteSqlRequest} message ExecuteSqlRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExecuteSqlRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.paramTypes = {};
                        if (options.defaults) {
                            object.session = "";
                            object.transaction = null;
                            object.sql = "";
                            object.params = null;
                            if (options.bytes === String)
                                object.resumeToken = "";
                            else {
                                object.resumeToken = [];
                                if (options.bytes !== Array)
                                    object.resumeToken = $util.newBuffer(object.resumeToken);
                            }
                            object.queryMode = options.enums === String ? "NORMAL" : 0;
                            if (options.bytes === String)
                                object.partitionToken = "";
                            else {
                                object.partitionToken = [];
                                if (options.bytes !== Array)
                                    object.partitionToken = $util.newBuffer(object.partitionToken);
                            }
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.seqno = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.seqno = options.longs === String ? "0" : 0;
                            object.queryOptions = null;
                            object.requestOptions = null;
                            object.directedReadOptions = null;
                            object.dataBoostEnabled = false;
                            object.lastStatement = false;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.TransactionSelector.toObject(message.transaction, options);
                        if (message.sql != null && message.hasOwnProperty("sql"))
                            object.sql = message.sql;
                        if (message.params != null && message.hasOwnProperty("params"))
                            object.params = $root.google.protobuf.Struct.toObject(message.params, options);
                        var keys2;
                        if (message.paramTypes && (keys2 = Object.keys(message.paramTypes)).length) {
                            object.paramTypes = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.paramTypes[keys2[j]] = $root.google.spanner.v1.Type.toObject(message.paramTypes[keys2[j]], options);
                        }
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            object.resumeToken = options.bytes === String ? $util.base64.encode(message.resumeToken, 0, message.resumeToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.resumeToken) : message.resumeToken;
                        if (message.queryMode != null && message.hasOwnProperty("queryMode"))
                            object.queryMode = options.enums === String ? $root.google.spanner.v1.ExecuteSqlRequest.QueryMode[message.queryMode] === undefined ? message.queryMode : $root.google.spanner.v1.ExecuteSqlRequest.QueryMode[message.queryMode] : message.queryMode;
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            object.partitionToken = options.bytes === String ? $util.base64.encode(message.partitionToken, 0, message.partitionToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.partitionToken) : message.partitionToken;
                        if (message.seqno != null && message.hasOwnProperty("seqno"))
                            if (typeof message.seqno === "number")
                                object.seqno = options.longs === String ? String(message.seqno) : message.seqno;
                            else
                                object.seqno = options.longs === String ? $util.Long.prototype.toString.call(message.seqno) : options.longs === Number ? new $util.LongBits(message.seqno.low >>> 0, message.seqno.high >>> 0).toNumber() : message.seqno;
                        if (message.queryOptions != null && message.hasOwnProperty("queryOptions"))
                            object.queryOptions = $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions.toObject(message.queryOptions, options);
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.directedReadOptions != null && message.hasOwnProperty("directedReadOptions"))
                            object.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.toObject(message.directedReadOptions, options);
                        if (message.dataBoostEnabled != null && message.hasOwnProperty("dataBoostEnabled"))
                            object.dataBoostEnabled = message.dataBoostEnabled;
                        if (message.lastStatement != null && message.hasOwnProperty("lastStatement"))
                            object.lastStatement = message.lastStatement;
                        return object;
                    };
    
                    /**
                     * Converts this ExecuteSqlRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExecuteSqlRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ExecuteSqlRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ExecuteSqlRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ExecuteSqlRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ExecuteSqlRequest";
                    };
    
                    /**
                     * QueryMode enum.
                     * @name google.spanner.v1.ExecuteSqlRequest.QueryMode
                     * @enum {number}
                     * @property {number} NORMAL=0 NORMAL value
                     * @property {number} PLAN=1 PLAN value
                     * @property {number} PROFILE=2 PROFILE value
                     * @property {number} WITH_STATS=3 WITH_STATS value
                     * @property {number} WITH_PLAN_AND_STATS=4 WITH_PLAN_AND_STATS value
                     */
                    ExecuteSqlRequest.QueryMode = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "NORMAL"] = 0;
                        values[valuesById[1] = "PLAN"] = 1;
                        values[valuesById[2] = "PROFILE"] = 2;
                        values[valuesById[3] = "WITH_STATS"] = 3;
                        values[valuesById[4] = "WITH_PLAN_AND_STATS"] = 4;
                        return values;
                    })();
    
                    ExecuteSqlRequest.QueryOptions = (function() {
    
                        /**
                         * Properties of a QueryOptions.
                         * @memberof google.spanner.v1.ExecuteSqlRequest
                         * @interface IQueryOptions
                         * @property {string|null} [optimizerVersion] QueryOptions optimizerVersion
                         * @property {string|null} [optimizerStatisticsPackage] QueryOptions optimizerStatisticsPackage
                         */
    
                        /**
                         * Constructs a new QueryOptions.
                         * @memberof google.spanner.v1.ExecuteSqlRequest
                         * @classdesc Represents a QueryOptions.
                         * @implements IQueryOptions
                         * @constructor
                         * @param {google.spanner.v1.ExecuteSqlRequest.IQueryOptions=} [properties] Properties to set
                         */
                        function QueryOptions(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * QueryOptions optimizerVersion.
                         * @member {string} optimizerVersion
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @instance
                         */
                        QueryOptions.prototype.optimizerVersion = "";
    
                        /**
                         * QueryOptions optimizerStatisticsPackage.
                         * @member {string} optimizerStatisticsPackage
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @instance
                         */
                        QueryOptions.prototype.optimizerStatisticsPackage = "";
    
                        /**
                         * Creates a new QueryOptions instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {google.spanner.v1.ExecuteSqlRequest.IQueryOptions=} [properties] Properties to set
                         * @returns {google.spanner.v1.ExecuteSqlRequest.QueryOptions} QueryOptions instance
                         */
                        QueryOptions.create = function create(properties) {
                            return new QueryOptions(properties);
                        };
    
                        /**
                         * Encodes the specified QueryOptions message. Does not implicitly {@link google.spanner.v1.ExecuteSqlRequest.QueryOptions.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {google.spanner.v1.ExecuteSqlRequest.IQueryOptions} message QueryOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryOptions.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.optimizerVersion != null && Object.hasOwnProperty.call(message, "optimizerVersion"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.optimizerVersion);
                            if (message.optimizerStatisticsPackage != null && Object.hasOwnProperty.call(message, "optimizerStatisticsPackage"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.optimizerStatisticsPackage);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified QueryOptions message, length delimited. Does not implicitly {@link google.spanner.v1.ExecuteSqlRequest.QueryOptions.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {google.spanner.v1.ExecuteSqlRequest.IQueryOptions} message QueryOptions message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        QueryOptions.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a QueryOptions message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ExecuteSqlRequest.QueryOptions} QueryOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryOptions.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.optimizerVersion = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.optimizerStatisticsPackage = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a QueryOptions message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ExecuteSqlRequest.QueryOptions} QueryOptions
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        QueryOptions.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a QueryOptions message.
                         * @function verify
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        QueryOptions.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.optimizerVersion != null && message.hasOwnProperty("optimizerVersion"))
                                if (!$util.isString(message.optimizerVersion))
                                    return "optimizerVersion: string expected";
                            if (message.optimizerStatisticsPackage != null && message.hasOwnProperty("optimizerStatisticsPackage"))
                                if (!$util.isString(message.optimizerStatisticsPackage))
                                    return "optimizerStatisticsPackage: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a QueryOptions message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ExecuteSqlRequest.QueryOptions} QueryOptions
                         */
                        QueryOptions.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions)
                                return object;
                            var message = new $root.google.spanner.v1.ExecuteSqlRequest.QueryOptions();
                            if (object.optimizerVersion != null)
                                message.optimizerVersion = String(object.optimizerVersion);
                            if (object.optimizerStatisticsPackage != null)
                                message.optimizerStatisticsPackage = String(object.optimizerStatisticsPackage);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a QueryOptions message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {google.spanner.v1.ExecuteSqlRequest.QueryOptions} message QueryOptions
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        QueryOptions.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.optimizerVersion = "";
                                object.optimizerStatisticsPackage = "";
                            }
                            if (message.optimizerVersion != null && message.hasOwnProperty("optimizerVersion"))
                                object.optimizerVersion = message.optimizerVersion;
                            if (message.optimizerStatisticsPackage != null && message.hasOwnProperty("optimizerStatisticsPackage"))
                                object.optimizerStatisticsPackage = message.optimizerStatisticsPackage;
                            return object;
                        };
    
                        /**
                         * Converts this QueryOptions to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        QueryOptions.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for QueryOptions
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ExecuteSqlRequest.QueryOptions
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        QueryOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ExecuteSqlRequest.QueryOptions";
                        };
    
                        return QueryOptions;
                    })();
    
                    return ExecuteSqlRequest;
                })();
    
                v1.ExecuteBatchDmlRequest = (function() {
    
                    /**
                     * Properties of an ExecuteBatchDmlRequest.
                     * @memberof google.spanner.v1
                     * @interface IExecuteBatchDmlRequest
                     * @property {string|null} [session] ExecuteBatchDmlRequest session
                     * @property {google.spanner.v1.ITransactionSelector|null} [transaction] ExecuteBatchDmlRequest transaction
                     * @property {Array.<google.spanner.v1.ExecuteBatchDmlRequest.IStatement>|null} [statements] ExecuteBatchDmlRequest statements
                     * @property {number|Long|null} [seqno] ExecuteBatchDmlRequest seqno
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] ExecuteBatchDmlRequest requestOptions
                     * @property {boolean|null} [lastStatements] ExecuteBatchDmlRequest lastStatements
                     */
    
                    /**
                     * Constructs a new ExecuteBatchDmlRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents an ExecuteBatchDmlRequest.
                     * @implements IExecuteBatchDmlRequest
                     * @constructor
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest=} [properties] Properties to set
                     */
                    function ExecuteBatchDmlRequest(properties) {
                        this.statements = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExecuteBatchDmlRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.session = "";
    
                    /**
                     * ExecuteBatchDmlRequest transaction.
                     * @member {google.spanner.v1.ITransactionSelector|null|undefined} transaction
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.transaction = null;
    
                    /**
                     * ExecuteBatchDmlRequest statements.
                     * @member {Array.<google.spanner.v1.ExecuteBatchDmlRequest.IStatement>} statements
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.statements = $util.emptyArray;
    
                    /**
                     * ExecuteBatchDmlRequest seqno.
                     * @member {number|Long} seqno
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.seqno = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * ExecuteBatchDmlRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.requestOptions = null;
    
                    /**
                     * ExecuteBatchDmlRequest lastStatements.
                     * @member {boolean} lastStatements
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     */
                    ExecuteBatchDmlRequest.prototype.lastStatements = false;
    
                    /**
                     * Creates a new ExecuteBatchDmlRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.ExecuteBatchDmlRequest} ExecuteBatchDmlRequest instance
                     */
                    ExecuteBatchDmlRequest.create = function create(properties) {
                        return new ExecuteBatchDmlRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ExecuteBatchDmlRequest message. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest} message ExecuteBatchDmlRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteBatchDmlRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.TransactionSelector.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.statements != null && message.statements.length)
                            for (var i = 0; i < message.statements.length; ++i)
                                $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement.encode(message.statements[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.seqno != null && Object.hasOwnProperty.call(message, "seqno"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int64(message.seqno);
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.lastStatements != null && Object.hasOwnProperty.call(message, "lastStatements"))
                            writer.uint32(/* id 6, wireType 0 =*/48).bool(message.lastStatements);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExecuteBatchDmlRequest message, length delimited. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlRequest} message ExecuteBatchDmlRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteBatchDmlRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExecuteBatchDmlRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ExecuteBatchDmlRequest} ExecuteBatchDmlRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteBatchDmlRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ExecuteBatchDmlRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.TransactionSelector.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    if (!(message.statements && message.statements.length))
                                        message.statements = [];
                                    message.statements.push($root.google.spanner.v1.ExecuteBatchDmlRequest.Statement.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 4: {
                                    message.seqno = reader.int64();
                                    break;
                                }
                            case 5: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 6: {
                                    message.lastStatements = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExecuteBatchDmlRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ExecuteBatchDmlRequest} ExecuteBatchDmlRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteBatchDmlRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExecuteBatchDmlRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExecuteBatchDmlRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.TransactionSelector.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.statements != null && message.hasOwnProperty("statements")) {
                            if (!Array.isArray(message.statements))
                                return "statements: array expected";
                            for (var i = 0; i < message.statements.length; ++i) {
                                var error = $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement.verify(message.statements[i]);
                                if (error)
                                    return "statements." + error;
                            }
                        }
                        if (message.seqno != null && message.hasOwnProperty("seqno"))
                            if (!$util.isInteger(message.seqno) && !(message.seqno && $util.isInteger(message.seqno.low) && $util.isInteger(message.seqno.high)))
                                return "seqno: integer|Long expected";
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.lastStatements != null && message.hasOwnProperty("lastStatements"))
                            if (typeof message.lastStatements !== "boolean")
                                return "lastStatements: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates an ExecuteBatchDmlRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ExecuteBatchDmlRequest} ExecuteBatchDmlRequest
                     */
                    ExecuteBatchDmlRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ExecuteBatchDmlRequest)
                            return object;
                        var message = new $root.google.spanner.v1.ExecuteBatchDmlRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.TransactionSelector.fromObject(object.transaction);
                        }
                        if (object.statements) {
                            if (!Array.isArray(object.statements))
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.statements: array expected");
                            message.statements = [];
                            for (var i = 0; i < object.statements.length; ++i) {
                                if (typeof object.statements[i] !== "object")
                                    throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.statements: object expected");
                                message.statements[i] = $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement.fromObject(object.statements[i]);
                            }
                        }
                        if (object.seqno != null)
                            if ($util.Long)
                                (message.seqno = $util.Long.fromValue(object.seqno)).unsigned = false;
                            else if (typeof object.seqno === "string")
                                message.seqno = parseInt(object.seqno, 10);
                            else if (typeof object.seqno === "number")
                                message.seqno = object.seqno;
                            else if (typeof object.seqno === "object")
                                message.seqno = new $util.LongBits(object.seqno.low >>> 0, object.seqno.high >>> 0).toNumber();
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.lastStatements != null)
                            message.lastStatements = Boolean(object.lastStatements);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExecuteBatchDmlRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {google.spanner.v1.ExecuteBatchDmlRequest} message ExecuteBatchDmlRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExecuteBatchDmlRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.statements = [];
                        if (options.defaults) {
                            object.session = "";
                            object.transaction = null;
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.seqno = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.seqno = options.longs === String ? "0" : 0;
                            object.requestOptions = null;
                            object.lastStatements = false;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.TransactionSelector.toObject(message.transaction, options);
                        if (message.statements && message.statements.length) {
                            object.statements = [];
                            for (var j = 0; j < message.statements.length; ++j)
                                object.statements[j] = $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement.toObject(message.statements[j], options);
                        }
                        if (message.seqno != null && message.hasOwnProperty("seqno"))
                            if (typeof message.seqno === "number")
                                object.seqno = options.longs === String ? String(message.seqno) : message.seqno;
                            else
                                object.seqno = options.longs === String ? $util.Long.prototype.toString.call(message.seqno) : options.longs === Number ? new $util.LongBits(message.seqno.low >>> 0, message.seqno.high >>> 0).toNumber() : message.seqno;
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.lastStatements != null && message.hasOwnProperty("lastStatements"))
                            object.lastStatements = message.lastStatements;
                        return object;
                    };
    
                    /**
                     * Converts this ExecuteBatchDmlRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExecuteBatchDmlRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ExecuteBatchDmlRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ExecuteBatchDmlRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ExecuteBatchDmlRequest";
                    };
    
                    ExecuteBatchDmlRequest.Statement = (function() {
    
                        /**
                         * Properties of a Statement.
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                         * @interface IStatement
                         * @property {string|null} [sql] Statement sql
                         * @property {google.protobuf.IStruct|null} [params] Statement params
                         * @property {Object.<string,google.spanner.v1.IType>|null} [paramTypes] Statement paramTypes
                         */
    
                        /**
                         * Constructs a new Statement.
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest
                         * @classdesc Represents a Statement.
                         * @implements IStatement
                         * @constructor
                         * @param {google.spanner.v1.ExecuteBatchDmlRequest.IStatement=} [properties] Properties to set
                         */
                        function Statement(properties) {
                            this.paramTypes = {};
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Statement sql.
                         * @member {string} sql
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @instance
                         */
                        Statement.prototype.sql = "";
    
                        /**
                         * Statement params.
                         * @member {google.protobuf.IStruct|null|undefined} params
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @instance
                         */
                        Statement.prototype.params = null;
    
                        /**
                         * Statement paramTypes.
                         * @member {Object.<string,google.spanner.v1.IType>} paramTypes
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @instance
                         */
                        Statement.prototype.paramTypes = $util.emptyObject;
    
                        /**
                         * Creates a new Statement instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {google.spanner.v1.ExecuteBatchDmlRequest.IStatement=} [properties] Properties to set
                         * @returns {google.spanner.v1.ExecuteBatchDmlRequest.Statement} Statement instance
                         */
                        Statement.create = function create(properties) {
                            return new Statement(properties);
                        };
    
                        /**
                         * Encodes the specified Statement message. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlRequest.Statement.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {google.spanner.v1.ExecuteBatchDmlRequest.IStatement} message Statement message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Statement.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.sql != null && Object.hasOwnProperty.call(message, "sql"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.sql);
                            if (message.params != null && Object.hasOwnProperty.call(message, "params"))
                                $root.google.protobuf.Struct.encode(message.params, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.paramTypes != null && Object.hasOwnProperty.call(message, "paramTypes"))
                                for (var keys = Object.keys(message.paramTypes), i = 0; i < keys.length; ++i) {
                                    writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);
                                    $root.google.spanner.v1.Type.encode(message.paramTypes[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                                }
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Statement message, length delimited. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlRequest.Statement.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {google.spanner.v1.ExecuteBatchDmlRequest.IStatement} message Statement message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Statement.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Statement message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ExecuteBatchDmlRequest.Statement} Statement
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Statement.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement(), key, value;
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.sql = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.params = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        if (message.paramTypes === $util.emptyObject)
                                            message.paramTypes = {};
                                        var end2 = reader.uint32() + reader.pos;
                                        key = "";
                                        value = null;
                                        while (reader.pos < end2) {
                                            var tag2 = reader.uint32();
                                            switch (tag2 >>> 3) {
                                            case 1:
                                                key = reader.string();
                                                break;
                                            case 2:
                                                value = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                                break;
                                            default:
                                                reader.skipType(tag2 & 7);
                                                break;
                                            }
                                        }
                                        message.paramTypes[key] = value;
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Statement message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ExecuteBatchDmlRequest.Statement} Statement
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Statement.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Statement message.
                         * @function verify
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Statement.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.sql != null && message.hasOwnProperty("sql"))
                                if (!$util.isString(message.sql))
                                    return "sql: string expected";
                            if (message.params != null && message.hasOwnProperty("params")) {
                                var error = $root.google.protobuf.Struct.verify(message.params);
                                if (error)
                                    return "params." + error;
                            }
                            if (message.paramTypes != null && message.hasOwnProperty("paramTypes")) {
                                if (!$util.isObject(message.paramTypes))
                                    return "paramTypes: object expected";
                                var key = Object.keys(message.paramTypes);
                                for (var i = 0; i < key.length; ++i) {
                                    var error = $root.google.spanner.v1.Type.verify(message.paramTypes[key[i]]);
                                    if (error)
                                        return "paramTypes." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a Statement message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ExecuteBatchDmlRequest.Statement} Statement
                         */
                        Statement.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement)
                                return object;
                            var message = new $root.google.spanner.v1.ExecuteBatchDmlRequest.Statement();
                            if (object.sql != null)
                                message.sql = String(object.sql);
                            if (object.params != null) {
                                if (typeof object.params !== "object")
                                    throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.Statement.params: object expected");
                                message.params = $root.google.protobuf.Struct.fromObject(object.params);
                            }
                            if (object.paramTypes) {
                                if (typeof object.paramTypes !== "object")
                                    throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.Statement.paramTypes: object expected");
                                message.paramTypes = {};
                                for (var keys = Object.keys(object.paramTypes), i = 0; i < keys.length; ++i) {
                                    if (typeof object.paramTypes[keys[i]] !== "object")
                                        throw TypeError(".google.spanner.v1.ExecuteBatchDmlRequest.Statement.paramTypes: object expected");
                                    message.paramTypes[keys[i]] = $root.google.spanner.v1.Type.fromObject(object.paramTypes[keys[i]]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Statement message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {google.spanner.v1.ExecuteBatchDmlRequest.Statement} message Statement
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Statement.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.objects || options.defaults)
                                object.paramTypes = {};
                            if (options.defaults) {
                                object.sql = "";
                                object.params = null;
                            }
                            if (message.sql != null && message.hasOwnProperty("sql"))
                                object.sql = message.sql;
                            if (message.params != null && message.hasOwnProperty("params"))
                                object.params = $root.google.protobuf.Struct.toObject(message.params, options);
                            var keys2;
                            if (message.paramTypes && (keys2 = Object.keys(message.paramTypes)).length) {
                                object.paramTypes = {};
                                for (var j = 0; j < keys2.length; ++j)
                                    object.paramTypes[keys2[j]] = $root.google.spanner.v1.Type.toObject(message.paramTypes[keys2[j]], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this Statement to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Statement.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Statement
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ExecuteBatchDmlRequest.Statement
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Statement.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ExecuteBatchDmlRequest.Statement";
                        };
    
                        return Statement;
                    })();
    
                    return ExecuteBatchDmlRequest;
                })();
    
                v1.ExecuteBatchDmlResponse = (function() {
    
                    /**
                     * Properties of an ExecuteBatchDmlResponse.
                     * @memberof google.spanner.v1
                     * @interface IExecuteBatchDmlResponse
                     * @property {Array.<google.spanner.v1.IResultSet>|null} [resultSets] ExecuteBatchDmlResponse resultSets
                     * @property {google.rpc.IStatus|null} [status] ExecuteBatchDmlResponse status
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] ExecuteBatchDmlResponse precommitToken
                     */
    
                    /**
                     * Constructs a new ExecuteBatchDmlResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents an ExecuteBatchDmlResponse.
                     * @implements IExecuteBatchDmlResponse
                     * @constructor
                     * @param {google.spanner.v1.IExecuteBatchDmlResponse=} [properties] Properties to set
                     */
                    function ExecuteBatchDmlResponse(properties) {
                        this.resultSets = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExecuteBatchDmlResponse resultSets.
                     * @member {Array.<google.spanner.v1.IResultSet>} resultSets
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @instance
                     */
                    ExecuteBatchDmlResponse.prototype.resultSets = $util.emptyArray;
    
                    /**
                     * ExecuteBatchDmlResponse status.
                     * @member {google.rpc.IStatus|null|undefined} status
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @instance
                     */
                    ExecuteBatchDmlResponse.prototype.status = null;
    
                    /**
                     * ExecuteBatchDmlResponse precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @instance
                     */
                    ExecuteBatchDmlResponse.prototype.precommitToken = null;
    
                    /**
                     * Creates a new ExecuteBatchDmlResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.ExecuteBatchDmlResponse} ExecuteBatchDmlResponse instance
                     */
                    ExecuteBatchDmlResponse.create = function create(properties) {
                        return new ExecuteBatchDmlResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ExecuteBatchDmlResponse message. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlResponse} message ExecuteBatchDmlResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteBatchDmlResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resultSets != null && message.resultSets.length)
                            for (var i = 0; i < message.resultSets.length; ++i)
                                $root.google.spanner.v1.ResultSet.encode(message.resultSets[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                            $root.google.rpc.Status.encode(message.status, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExecuteBatchDmlResponse message, length delimited. Does not implicitly {@link google.spanner.v1.ExecuteBatchDmlResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {google.spanner.v1.IExecuteBatchDmlResponse} message ExecuteBatchDmlResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExecuteBatchDmlResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExecuteBatchDmlResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ExecuteBatchDmlResponse} ExecuteBatchDmlResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteBatchDmlResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ExecuteBatchDmlResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.resultSets && message.resultSets.length))
                                        message.resultSets = [];
                                    message.resultSets.push($root.google.spanner.v1.ResultSet.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 2: {
                                    message.status = $root.google.rpc.Status.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExecuteBatchDmlResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ExecuteBatchDmlResponse} ExecuteBatchDmlResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExecuteBatchDmlResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExecuteBatchDmlResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExecuteBatchDmlResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resultSets != null && message.hasOwnProperty("resultSets")) {
                            if (!Array.isArray(message.resultSets))
                                return "resultSets: array expected";
                            for (var i = 0; i < message.resultSets.length; ++i) {
                                var error = $root.google.spanner.v1.ResultSet.verify(message.resultSets[i]);
                                if (error)
                                    return "resultSets." + error;
                            }
                        }
                        if (message.status != null && message.hasOwnProperty("status")) {
                            var error = $root.google.rpc.Status.verify(message.status);
                            if (error)
                                return "status." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                            if (error)
                                return "precommitToken." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an ExecuteBatchDmlResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ExecuteBatchDmlResponse} ExecuteBatchDmlResponse
                     */
                    ExecuteBatchDmlResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ExecuteBatchDmlResponse)
                            return object;
                        var message = new $root.google.spanner.v1.ExecuteBatchDmlResponse();
                        if (object.resultSets) {
                            if (!Array.isArray(object.resultSets))
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlResponse.resultSets: array expected");
                            message.resultSets = [];
                            for (var i = 0; i < object.resultSets.length; ++i) {
                                if (typeof object.resultSets[i] !== "object")
                                    throw TypeError(".google.spanner.v1.ExecuteBatchDmlResponse.resultSets: object expected");
                                message.resultSets[i] = $root.google.spanner.v1.ResultSet.fromObject(object.resultSets[i]);
                            }
                        }
                        if (object.status != null) {
                            if (typeof object.status !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlResponse.status: object expected");
                            message.status = $root.google.rpc.Status.fromObject(object.status);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.ExecuteBatchDmlResponse.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExecuteBatchDmlResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {google.spanner.v1.ExecuteBatchDmlResponse} message ExecuteBatchDmlResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExecuteBatchDmlResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.resultSets = [];
                        if (options.defaults) {
                            object.status = null;
                            object.precommitToken = null;
                        }
                        if (message.resultSets && message.resultSets.length) {
                            object.resultSets = [];
                            for (var j = 0; j < message.resultSets.length; ++j)
                                object.resultSets[j] = $root.google.spanner.v1.ResultSet.toObject(message.resultSets[j], options);
                        }
                        if (message.status != null && message.hasOwnProperty("status"))
                            object.status = $root.google.rpc.Status.toObject(message.status, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                        return object;
                    };
    
                    /**
                     * Converts this ExecuteBatchDmlResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExecuteBatchDmlResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ExecuteBatchDmlResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ExecuteBatchDmlResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ExecuteBatchDmlResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ExecuteBatchDmlResponse";
                    };
    
                    return ExecuteBatchDmlResponse;
                })();
    
                v1.PartitionOptions = (function() {
    
                    /**
                     * Properties of a PartitionOptions.
                     * @memberof google.spanner.v1
                     * @interface IPartitionOptions
                     * @property {number|Long|null} [partitionSizeBytes] PartitionOptions partitionSizeBytes
                     * @property {number|Long|null} [maxPartitions] PartitionOptions maxPartitions
                     */
    
                    /**
                     * Constructs a new PartitionOptions.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PartitionOptions.
                     * @implements IPartitionOptions
                     * @constructor
                     * @param {google.spanner.v1.IPartitionOptions=} [properties] Properties to set
                     */
                    function PartitionOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PartitionOptions partitionSizeBytes.
                     * @member {number|Long} partitionSizeBytes
                     * @memberof google.spanner.v1.PartitionOptions
                     * @instance
                     */
                    PartitionOptions.prototype.partitionSizeBytes = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * PartitionOptions maxPartitions.
                     * @member {number|Long} maxPartitions
                     * @memberof google.spanner.v1.PartitionOptions
                     * @instance
                     */
                    PartitionOptions.prototype.maxPartitions = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * Creates a new PartitionOptions instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {google.spanner.v1.IPartitionOptions=} [properties] Properties to set
                     * @returns {google.spanner.v1.PartitionOptions} PartitionOptions instance
                     */
                    PartitionOptions.create = function create(properties) {
                        return new PartitionOptions(properties);
                    };
    
                    /**
                     * Encodes the specified PartitionOptions message. Does not implicitly {@link google.spanner.v1.PartitionOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {google.spanner.v1.IPartitionOptions} message PartitionOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.partitionSizeBytes != null && Object.hasOwnProperty.call(message, "partitionSizeBytes"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int64(message.partitionSizeBytes);
                        if (message.maxPartitions != null && Object.hasOwnProperty.call(message, "maxPartitions"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int64(message.maxPartitions);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PartitionOptions message, length delimited. Does not implicitly {@link google.spanner.v1.PartitionOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {google.spanner.v1.IPartitionOptions} message PartitionOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PartitionOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PartitionOptions} PartitionOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionOptions.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PartitionOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.partitionSizeBytes = reader.int64();
                                    break;
                                }
                            case 2: {
                                    message.maxPartitions = reader.int64();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PartitionOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PartitionOptions} PartitionOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PartitionOptions message.
                     * @function verify
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PartitionOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.partitionSizeBytes != null && message.hasOwnProperty("partitionSizeBytes"))
                            if (!$util.isInteger(message.partitionSizeBytes) && !(message.partitionSizeBytes && $util.isInteger(message.partitionSizeBytes.low) && $util.isInteger(message.partitionSizeBytes.high)))
                                return "partitionSizeBytes: integer|Long expected";
                        if (message.maxPartitions != null && message.hasOwnProperty("maxPartitions"))
                            if (!$util.isInteger(message.maxPartitions) && !(message.maxPartitions && $util.isInteger(message.maxPartitions.low) && $util.isInteger(message.maxPartitions.high)))
                                return "maxPartitions: integer|Long expected";
                        return null;
                    };
    
                    /**
                     * Creates a PartitionOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PartitionOptions} PartitionOptions
                     */
                    PartitionOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PartitionOptions)
                            return object;
                        var message = new $root.google.spanner.v1.PartitionOptions();
                        if (object.partitionSizeBytes != null)
                            if ($util.Long)
                                (message.partitionSizeBytes = $util.Long.fromValue(object.partitionSizeBytes)).unsigned = false;
                            else if (typeof object.partitionSizeBytes === "string")
                                message.partitionSizeBytes = parseInt(object.partitionSizeBytes, 10);
                            else if (typeof object.partitionSizeBytes === "number")
                                message.partitionSizeBytes = object.partitionSizeBytes;
                            else if (typeof object.partitionSizeBytes === "object")
                                message.partitionSizeBytes = new $util.LongBits(object.partitionSizeBytes.low >>> 0, object.partitionSizeBytes.high >>> 0).toNumber();
                        if (object.maxPartitions != null)
                            if ($util.Long)
                                (message.maxPartitions = $util.Long.fromValue(object.maxPartitions)).unsigned = false;
                            else if (typeof object.maxPartitions === "string")
                                message.maxPartitions = parseInt(object.maxPartitions, 10);
                            else if (typeof object.maxPartitions === "number")
                                message.maxPartitions = object.maxPartitions;
                            else if (typeof object.maxPartitions === "object")
                                message.maxPartitions = new $util.LongBits(object.maxPartitions.low >>> 0, object.maxPartitions.high >>> 0).toNumber();
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PartitionOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {google.spanner.v1.PartitionOptions} message PartitionOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PartitionOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.partitionSizeBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.partitionSizeBytes = options.longs === String ? "0" : 0;
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.maxPartitions = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.maxPartitions = options.longs === String ? "0" : 0;
                        }
                        if (message.partitionSizeBytes != null && message.hasOwnProperty("partitionSizeBytes"))
                            if (typeof message.partitionSizeBytes === "number")
                                object.partitionSizeBytes = options.longs === String ? String(message.partitionSizeBytes) : message.partitionSizeBytes;
                            else
                                object.partitionSizeBytes = options.longs === String ? $util.Long.prototype.toString.call(message.partitionSizeBytes) : options.longs === Number ? new $util.LongBits(message.partitionSizeBytes.low >>> 0, message.partitionSizeBytes.high >>> 0).toNumber() : message.partitionSizeBytes;
                        if (message.maxPartitions != null && message.hasOwnProperty("maxPartitions"))
                            if (typeof message.maxPartitions === "number")
                                object.maxPartitions = options.longs === String ? String(message.maxPartitions) : message.maxPartitions;
                            else
                                object.maxPartitions = options.longs === String ? $util.Long.prototype.toString.call(message.maxPartitions) : options.longs === Number ? new $util.LongBits(message.maxPartitions.low >>> 0, message.maxPartitions.high >>> 0).toNumber() : message.maxPartitions;
                        return object;
                    };
    
                    /**
                     * Converts this PartitionOptions to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PartitionOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PartitionOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PartitionOptions
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PartitionOptions
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PartitionOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PartitionOptions";
                    };
    
                    return PartitionOptions;
                })();
    
                v1.PartitionQueryRequest = (function() {
    
                    /**
                     * Properties of a PartitionQueryRequest.
                     * @memberof google.spanner.v1
                     * @interface IPartitionQueryRequest
                     * @property {string|null} [session] PartitionQueryRequest session
                     * @property {google.spanner.v1.ITransactionSelector|null} [transaction] PartitionQueryRequest transaction
                     * @property {string|null} [sql] PartitionQueryRequest sql
                     * @property {google.protobuf.IStruct|null} [params] PartitionQueryRequest params
                     * @property {Object.<string,google.spanner.v1.IType>|null} [paramTypes] PartitionQueryRequest paramTypes
                     * @property {google.spanner.v1.IPartitionOptions|null} [partitionOptions] PartitionQueryRequest partitionOptions
                     */
    
                    /**
                     * Constructs a new PartitionQueryRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PartitionQueryRequest.
                     * @implements IPartitionQueryRequest
                     * @constructor
                     * @param {google.spanner.v1.IPartitionQueryRequest=} [properties] Properties to set
                     */
                    function PartitionQueryRequest(properties) {
                        this.paramTypes = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PartitionQueryRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.session = "";
    
                    /**
                     * PartitionQueryRequest transaction.
                     * @member {google.spanner.v1.ITransactionSelector|null|undefined} transaction
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.transaction = null;
    
                    /**
                     * PartitionQueryRequest sql.
                     * @member {string} sql
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.sql = "";
    
                    /**
                     * PartitionQueryRequest params.
                     * @member {google.protobuf.IStruct|null|undefined} params
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.params = null;
    
                    /**
                     * PartitionQueryRequest paramTypes.
                     * @member {Object.<string,google.spanner.v1.IType>} paramTypes
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.paramTypes = $util.emptyObject;
    
                    /**
                     * PartitionQueryRequest partitionOptions.
                     * @member {google.spanner.v1.IPartitionOptions|null|undefined} partitionOptions
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     */
                    PartitionQueryRequest.prototype.partitionOptions = null;
    
                    /**
                     * Creates a new PartitionQueryRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionQueryRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.PartitionQueryRequest} PartitionQueryRequest instance
                     */
                    PartitionQueryRequest.create = function create(properties) {
                        return new PartitionQueryRequest(properties);
                    };
    
                    /**
                     * Encodes the specified PartitionQueryRequest message. Does not implicitly {@link google.spanner.v1.PartitionQueryRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionQueryRequest} message PartitionQueryRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionQueryRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.TransactionSelector.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.sql != null && Object.hasOwnProperty.call(message, "sql"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.sql);
                        if (message.params != null && Object.hasOwnProperty.call(message, "params"))
                            $root.google.protobuf.Struct.encode(message.params, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.paramTypes != null && Object.hasOwnProperty.call(message, "paramTypes"))
                            for (var keys = Object.keys(message.paramTypes), i = 0; i < keys.length; ++i) {
                                writer.uint32(/* id 5, wireType 2 =*/42).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);
                                $root.google.spanner.v1.Type.encode(message.paramTypes[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                            }
                        if (message.partitionOptions != null && Object.hasOwnProperty.call(message, "partitionOptions"))
                            $root.google.spanner.v1.PartitionOptions.encode(message.partitionOptions, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PartitionQueryRequest message, length delimited. Does not implicitly {@link google.spanner.v1.PartitionQueryRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionQueryRequest} message PartitionQueryRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionQueryRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PartitionQueryRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PartitionQueryRequest} PartitionQueryRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionQueryRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PartitionQueryRequest(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.TransactionSelector.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.sql = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.params = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    if (message.paramTypes === $util.emptyObject)
                                        message.paramTypes = {};
                                    var end2 = reader.uint32() + reader.pos;
                                    key = "";
                                    value = null;
                                    while (reader.pos < end2) {
                                        var tag2 = reader.uint32();
                                        switch (tag2 >>> 3) {
                                        case 1:
                                            key = reader.string();
                                            break;
                                        case 2:
                                            value = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                            break;
                                        default:
                                            reader.skipType(tag2 & 7);
                                            break;
                                        }
                                    }
                                    message.paramTypes[key] = value;
                                    break;
                                }
                            case 6: {
                                    message.partitionOptions = $root.google.spanner.v1.PartitionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PartitionQueryRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PartitionQueryRequest} PartitionQueryRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionQueryRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PartitionQueryRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PartitionQueryRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.TransactionSelector.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.sql != null && message.hasOwnProperty("sql"))
                            if (!$util.isString(message.sql))
                                return "sql: string expected";
                        if (message.params != null && message.hasOwnProperty("params")) {
                            var error = $root.google.protobuf.Struct.verify(message.params);
                            if (error)
                                return "params." + error;
                        }
                        if (message.paramTypes != null && message.hasOwnProperty("paramTypes")) {
                            if (!$util.isObject(message.paramTypes))
                                return "paramTypes: object expected";
                            var key = Object.keys(message.paramTypes);
                            for (var i = 0; i < key.length; ++i) {
                                var error = $root.google.spanner.v1.Type.verify(message.paramTypes[key[i]]);
                                if (error)
                                    return "paramTypes." + error;
                            }
                        }
                        if (message.partitionOptions != null && message.hasOwnProperty("partitionOptions")) {
                            var error = $root.google.spanner.v1.PartitionOptions.verify(message.partitionOptions);
                            if (error)
                                return "partitionOptions." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a PartitionQueryRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PartitionQueryRequest} PartitionQueryRequest
                     */
                    PartitionQueryRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PartitionQueryRequest)
                            return object;
                        var message = new $root.google.spanner.v1.PartitionQueryRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.PartitionQueryRequest.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.TransactionSelector.fromObject(object.transaction);
                        }
                        if (object.sql != null)
                            message.sql = String(object.sql);
                        if (object.params != null) {
                            if (typeof object.params !== "object")
                                throw TypeError(".google.spanner.v1.PartitionQueryRequest.params: object expected");
                            message.params = $root.google.protobuf.Struct.fromObject(object.params);
                        }
                        if (object.paramTypes) {
                            if (typeof object.paramTypes !== "object")
                                throw TypeError(".google.spanner.v1.PartitionQueryRequest.paramTypes: object expected");
                            message.paramTypes = {};
                            for (var keys = Object.keys(object.paramTypes), i = 0; i < keys.length; ++i) {
                                if (typeof object.paramTypes[keys[i]] !== "object")
                                    throw TypeError(".google.spanner.v1.PartitionQueryRequest.paramTypes: object expected");
                                message.paramTypes[keys[i]] = $root.google.spanner.v1.Type.fromObject(object.paramTypes[keys[i]]);
                            }
                        }
                        if (object.partitionOptions != null) {
                            if (typeof object.partitionOptions !== "object")
                                throw TypeError(".google.spanner.v1.PartitionQueryRequest.partitionOptions: object expected");
                            message.partitionOptions = $root.google.spanner.v1.PartitionOptions.fromObject(object.partitionOptions);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PartitionQueryRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {google.spanner.v1.PartitionQueryRequest} message PartitionQueryRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PartitionQueryRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.paramTypes = {};
                        if (options.defaults) {
                            object.session = "";
                            object.transaction = null;
                            object.sql = "";
                            object.params = null;
                            object.partitionOptions = null;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.TransactionSelector.toObject(message.transaction, options);
                        if (message.sql != null && message.hasOwnProperty("sql"))
                            object.sql = message.sql;
                        if (message.params != null && message.hasOwnProperty("params"))
                            object.params = $root.google.protobuf.Struct.toObject(message.params, options);
                        var keys2;
                        if (message.paramTypes && (keys2 = Object.keys(message.paramTypes)).length) {
                            object.paramTypes = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.paramTypes[keys2[j]] = $root.google.spanner.v1.Type.toObject(message.paramTypes[keys2[j]], options);
                        }
                        if (message.partitionOptions != null && message.hasOwnProperty("partitionOptions"))
                            object.partitionOptions = $root.google.spanner.v1.PartitionOptions.toObject(message.partitionOptions, options);
                        return object;
                    };
    
                    /**
                     * Converts this PartitionQueryRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PartitionQueryRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PartitionQueryRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PartitionQueryRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PartitionQueryRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PartitionQueryRequest";
                    };
    
                    return PartitionQueryRequest;
                })();
    
                v1.PartitionReadRequest = (function() {
    
                    /**
                     * Properties of a PartitionReadRequest.
                     * @memberof google.spanner.v1
                     * @interface IPartitionReadRequest
                     * @property {string|null} [session] PartitionReadRequest session
                     * @property {google.spanner.v1.ITransactionSelector|null} [transaction] PartitionReadRequest transaction
                     * @property {string|null} [table] PartitionReadRequest table
                     * @property {string|null} [index] PartitionReadRequest index
                     * @property {Array.<string>|null} [columns] PartitionReadRequest columns
                     * @property {google.spanner.v1.IKeySet|null} [keySet] PartitionReadRequest keySet
                     * @property {google.spanner.v1.IPartitionOptions|null} [partitionOptions] PartitionReadRequest partitionOptions
                     */
    
                    /**
                     * Constructs a new PartitionReadRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PartitionReadRequest.
                     * @implements IPartitionReadRequest
                     * @constructor
                     * @param {google.spanner.v1.IPartitionReadRequest=} [properties] Properties to set
                     */
                    function PartitionReadRequest(properties) {
                        this.columns = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PartitionReadRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.session = "";
    
                    /**
                     * PartitionReadRequest transaction.
                     * @member {google.spanner.v1.ITransactionSelector|null|undefined} transaction
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.transaction = null;
    
                    /**
                     * PartitionReadRequest table.
                     * @member {string} table
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.table = "";
    
                    /**
                     * PartitionReadRequest index.
                     * @member {string} index
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.index = "";
    
                    /**
                     * PartitionReadRequest columns.
                     * @member {Array.<string>} columns
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.columns = $util.emptyArray;
    
                    /**
                     * PartitionReadRequest keySet.
                     * @member {google.spanner.v1.IKeySet|null|undefined} keySet
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.keySet = null;
    
                    /**
                     * PartitionReadRequest partitionOptions.
                     * @member {google.spanner.v1.IPartitionOptions|null|undefined} partitionOptions
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     */
                    PartitionReadRequest.prototype.partitionOptions = null;
    
                    /**
                     * Creates a new PartitionReadRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionReadRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.PartitionReadRequest} PartitionReadRequest instance
                     */
                    PartitionReadRequest.create = function create(properties) {
                        return new PartitionReadRequest(properties);
                    };
    
                    /**
                     * Encodes the specified PartitionReadRequest message. Does not implicitly {@link google.spanner.v1.PartitionReadRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionReadRequest} message PartitionReadRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionReadRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.TransactionSelector.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.table);
                        if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.index);
                        if (message.columns != null && message.columns.length)
                            for (var i = 0; i < message.columns.length; ++i)
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.columns[i]);
                        if (message.keySet != null && Object.hasOwnProperty.call(message, "keySet"))
                            $root.google.spanner.v1.KeySet.encode(message.keySet, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        if (message.partitionOptions != null && Object.hasOwnProperty.call(message, "partitionOptions"))
                            $root.google.spanner.v1.PartitionOptions.encode(message.partitionOptions, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PartitionReadRequest message, length delimited. Does not implicitly {@link google.spanner.v1.PartitionReadRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {google.spanner.v1.IPartitionReadRequest} message PartitionReadRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionReadRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PartitionReadRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PartitionReadRequest} PartitionReadRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionReadRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PartitionReadRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.TransactionSelector.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.table = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.index = reader.string();
                                    break;
                                }
                            case 5: {
                                    if (!(message.columns && message.columns.length))
                                        message.columns = [];
                                    message.columns.push(reader.string());
                                    break;
                                }
                            case 6: {
                                    message.keySet = $root.google.spanner.v1.KeySet.decode(reader, reader.uint32());
                                    break;
                                }
                            case 9: {
                                    message.partitionOptions = $root.google.spanner.v1.PartitionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PartitionReadRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PartitionReadRequest} PartitionReadRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionReadRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PartitionReadRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PartitionReadRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.TransactionSelector.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.table != null && message.hasOwnProperty("table"))
                            if (!$util.isString(message.table))
                                return "table: string expected";
                        if (message.index != null && message.hasOwnProperty("index"))
                            if (!$util.isString(message.index))
                                return "index: string expected";
                        if (message.columns != null && message.hasOwnProperty("columns")) {
                            if (!Array.isArray(message.columns))
                                return "columns: array expected";
                            for (var i = 0; i < message.columns.length; ++i)
                                if (!$util.isString(message.columns[i]))
                                    return "columns: string[] expected";
                        }
                        if (message.keySet != null && message.hasOwnProperty("keySet")) {
                            var error = $root.google.spanner.v1.KeySet.verify(message.keySet);
                            if (error)
                                return "keySet." + error;
                        }
                        if (message.partitionOptions != null && message.hasOwnProperty("partitionOptions")) {
                            var error = $root.google.spanner.v1.PartitionOptions.verify(message.partitionOptions);
                            if (error)
                                return "partitionOptions." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a PartitionReadRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PartitionReadRequest} PartitionReadRequest
                     */
                    PartitionReadRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PartitionReadRequest)
                            return object;
                        var message = new $root.google.spanner.v1.PartitionReadRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.PartitionReadRequest.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.TransactionSelector.fromObject(object.transaction);
                        }
                        if (object.table != null)
                            message.table = String(object.table);
                        if (object.index != null)
                            message.index = String(object.index);
                        if (object.columns) {
                            if (!Array.isArray(object.columns))
                                throw TypeError(".google.spanner.v1.PartitionReadRequest.columns: array expected");
                            message.columns = [];
                            for (var i = 0; i < object.columns.length; ++i)
                                message.columns[i] = String(object.columns[i]);
                        }
                        if (object.keySet != null) {
                            if (typeof object.keySet !== "object")
                                throw TypeError(".google.spanner.v1.PartitionReadRequest.keySet: object expected");
                            message.keySet = $root.google.spanner.v1.KeySet.fromObject(object.keySet);
                        }
                        if (object.partitionOptions != null) {
                            if (typeof object.partitionOptions !== "object")
                                throw TypeError(".google.spanner.v1.PartitionReadRequest.partitionOptions: object expected");
                            message.partitionOptions = $root.google.spanner.v1.PartitionOptions.fromObject(object.partitionOptions);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PartitionReadRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {google.spanner.v1.PartitionReadRequest} message PartitionReadRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PartitionReadRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.columns = [];
                        if (options.defaults) {
                            object.session = "";
                            object.transaction = null;
                            object.table = "";
                            object.index = "";
                            object.keySet = null;
                            object.partitionOptions = null;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.TransactionSelector.toObject(message.transaction, options);
                        if (message.table != null && message.hasOwnProperty("table"))
                            object.table = message.table;
                        if (message.index != null && message.hasOwnProperty("index"))
                            object.index = message.index;
                        if (message.columns && message.columns.length) {
                            object.columns = [];
                            for (var j = 0; j < message.columns.length; ++j)
                                object.columns[j] = message.columns[j];
                        }
                        if (message.keySet != null && message.hasOwnProperty("keySet"))
                            object.keySet = $root.google.spanner.v1.KeySet.toObject(message.keySet, options);
                        if (message.partitionOptions != null && message.hasOwnProperty("partitionOptions"))
                            object.partitionOptions = $root.google.spanner.v1.PartitionOptions.toObject(message.partitionOptions, options);
                        return object;
                    };
    
                    /**
                     * Converts this PartitionReadRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PartitionReadRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PartitionReadRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PartitionReadRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PartitionReadRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PartitionReadRequest";
                    };
    
                    return PartitionReadRequest;
                })();
    
                v1.Partition = (function() {
    
                    /**
                     * Properties of a Partition.
                     * @memberof google.spanner.v1
                     * @interface IPartition
                     * @property {Uint8Array|null} [partitionToken] Partition partitionToken
                     */
    
                    /**
                     * Constructs a new Partition.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Partition.
                     * @implements IPartition
                     * @constructor
                     * @param {google.spanner.v1.IPartition=} [properties] Properties to set
                     */
                    function Partition(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Partition partitionToken.
                     * @member {Uint8Array} partitionToken
                     * @memberof google.spanner.v1.Partition
                     * @instance
                     */
                    Partition.prototype.partitionToken = $util.newBuffer([]);
    
                    /**
                     * Creates a new Partition instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {google.spanner.v1.IPartition=} [properties] Properties to set
                     * @returns {google.spanner.v1.Partition} Partition instance
                     */
                    Partition.create = function create(properties) {
                        return new Partition(properties);
                    };
    
                    /**
                     * Encodes the specified Partition message. Does not implicitly {@link google.spanner.v1.Partition.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {google.spanner.v1.IPartition} message Partition message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Partition.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                            writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.partitionToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Partition message, length delimited. Does not implicitly {@link google.spanner.v1.Partition.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {google.spanner.v1.IPartition} message Partition message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Partition.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Partition message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.Partition} Partition
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Partition.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Partition();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.partitionToken = reader.bytes();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Partition message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.Partition} Partition
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Partition.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Partition message.
                     * @function verify
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Partition.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            if (!(message.partitionToken && typeof message.partitionToken.length === "number" || $util.isString(message.partitionToken)))
                                return "partitionToken: buffer expected";
                        return null;
                    };
    
                    /**
                     * Creates a Partition message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.Partition} Partition
                     */
                    Partition.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.Partition)
                            return object;
                        var message = new $root.google.spanner.v1.Partition();
                        if (object.partitionToken != null)
                            if (typeof object.partitionToken === "string")
                                $util.base64.decode(object.partitionToken, message.partitionToken = $util.newBuffer($util.base64.length(object.partitionToken)), 0);
                            else if (object.partitionToken.length >= 0)
                                message.partitionToken = object.partitionToken;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Partition message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {google.spanner.v1.Partition} message Partition
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Partition.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            if (options.bytes === String)
                                object.partitionToken = "";
                            else {
                                object.partitionToken = [];
                                if (options.bytes !== Array)
                                    object.partitionToken = $util.newBuffer(object.partitionToken);
                            }
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            object.partitionToken = options.bytes === String ? $util.base64.encode(message.partitionToken, 0, message.partitionToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.partitionToken) : message.partitionToken;
                        return object;
                    };
    
                    /**
                     * Converts this Partition to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.Partition
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Partition.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Partition
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.Partition
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Partition.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.Partition";
                    };
    
                    return Partition;
                })();
    
                v1.PartitionResponse = (function() {
    
                    /**
                     * Properties of a PartitionResponse.
                     * @memberof google.spanner.v1
                     * @interface IPartitionResponse
                     * @property {Array.<google.spanner.v1.IPartition>|null} [partitions] PartitionResponse partitions
                     * @property {google.spanner.v1.ITransaction|null} [transaction] PartitionResponse transaction
                     */
    
                    /**
                     * Constructs a new PartitionResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PartitionResponse.
                     * @implements IPartitionResponse
                     * @constructor
                     * @param {google.spanner.v1.IPartitionResponse=} [properties] Properties to set
                     */
                    function PartitionResponse(properties) {
                        this.partitions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PartitionResponse partitions.
                     * @member {Array.<google.spanner.v1.IPartition>} partitions
                     * @memberof google.spanner.v1.PartitionResponse
                     * @instance
                     */
                    PartitionResponse.prototype.partitions = $util.emptyArray;
    
                    /**
                     * PartitionResponse transaction.
                     * @member {google.spanner.v1.ITransaction|null|undefined} transaction
                     * @memberof google.spanner.v1.PartitionResponse
                     * @instance
                     */
                    PartitionResponse.prototype.transaction = null;
    
                    /**
                     * Creates a new PartitionResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {google.spanner.v1.IPartitionResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.PartitionResponse} PartitionResponse instance
                     */
                    PartitionResponse.create = function create(properties) {
                        return new PartitionResponse(properties);
                    };
    
                    /**
                     * Encodes the specified PartitionResponse message. Does not implicitly {@link google.spanner.v1.PartitionResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {google.spanner.v1.IPartitionResponse} message PartitionResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.partitions != null && message.partitions.length)
                            for (var i = 0; i < message.partitions.length; ++i)
                                $root.google.spanner.v1.Partition.encode(message.partitions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.Transaction.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PartitionResponse message, length delimited. Does not implicitly {@link google.spanner.v1.PartitionResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {google.spanner.v1.IPartitionResponse} message PartitionResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartitionResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PartitionResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PartitionResponse} PartitionResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PartitionResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.partitions && message.partitions.length))
                                        message.partitions = [];
                                    message.partitions.push($root.google.spanner.v1.Partition.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.Transaction.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PartitionResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PartitionResponse} PartitionResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartitionResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PartitionResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PartitionResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.partitions != null && message.hasOwnProperty("partitions")) {
                            if (!Array.isArray(message.partitions))
                                return "partitions: array expected";
                            for (var i = 0; i < message.partitions.length; ++i) {
                                var error = $root.google.spanner.v1.Partition.verify(message.partitions[i]);
                                if (error)
                                    return "partitions." + error;
                            }
                        }
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.Transaction.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a PartitionResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PartitionResponse} PartitionResponse
                     */
                    PartitionResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PartitionResponse)
                            return object;
                        var message = new $root.google.spanner.v1.PartitionResponse();
                        if (object.partitions) {
                            if (!Array.isArray(object.partitions))
                                throw TypeError(".google.spanner.v1.PartitionResponse.partitions: array expected");
                            message.partitions = [];
                            for (var i = 0; i < object.partitions.length; ++i) {
                                if (typeof object.partitions[i] !== "object")
                                    throw TypeError(".google.spanner.v1.PartitionResponse.partitions: object expected");
                                message.partitions[i] = $root.google.spanner.v1.Partition.fromObject(object.partitions[i]);
                            }
                        }
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.PartitionResponse.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.Transaction.fromObject(object.transaction);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PartitionResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {google.spanner.v1.PartitionResponse} message PartitionResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PartitionResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.partitions = [];
                        if (options.defaults)
                            object.transaction = null;
                        if (message.partitions && message.partitions.length) {
                            object.partitions = [];
                            for (var j = 0; j < message.partitions.length; ++j)
                                object.partitions[j] = $root.google.spanner.v1.Partition.toObject(message.partitions[j], options);
                        }
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.Transaction.toObject(message.transaction, options);
                        return object;
                    };
    
                    /**
                     * Converts this PartitionResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PartitionResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PartitionResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PartitionResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PartitionResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PartitionResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PartitionResponse";
                    };
    
                    return PartitionResponse;
                })();
    
                v1.ReadRequest = (function() {
    
                    /**
                     * Properties of a ReadRequest.
                     * @memberof google.spanner.v1
                     * @interface IReadRequest
                     * @property {string|null} [session] ReadRequest session
                     * @property {google.spanner.v1.ITransactionSelector|null} [transaction] ReadRequest transaction
                     * @property {string|null} [table] ReadRequest table
                     * @property {string|null} [index] ReadRequest index
                     * @property {Array.<string>|null} [columns] ReadRequest columns
                     * @property {google.spanner.v1.IKeySet|null} [keySet] ReadRequest keySet
                     * @property {number|Long|null} [limit] ReadRequest limit
                     * @property {Uint8Array|null} [resumeToken] ReadRequest resumeToken
                     * @property {Uint8Array|null} [partitionToken] ReadRequest partitionToken
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] ReadRequest requestOptions
                     * @property {google.spanner.v1.IDirectedReadOptions|null} [directedReadOptions] ReadRequest directedReadOptions
                     * @property {boolean|null} [dataBoostEnabled] ReadRequest dataBoostEnabled
                     * @property {google.spanner.v1.ReadRequest.OrderBy|null} [orderBy] ReadRequest orderBy
                     * @property {google.spanner.v1.ReadRequest.LockHint|null} [lockHint] ReadRequest lockHint
                     */
    
                    /**
                     * Constructs a new ReadRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ReadRequest.
                     * @implements IReadRequest
                     * @constructor
                     * @param {google.spanner.v1.IReadRequest=} [properties] Properties to set
                     */
                    function ReadRequest(properties) {
                        this.columns = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ReadRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.session = "";
    
                    /**
                     * ReadRequest transaction.
                     * @member {google.spanner.v1.ITransactionSelector|null|undefined} transaction
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.transaction = null;
    
                    /**
                     * ReadRequest table.
                     * @member {string} table
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.table = "";
    
                    /**
                     * ReadRequest index.
                     * @member {string} index
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.index = "";
    
                    /**
                     * ReadRequest columns.
                     * @member {Array.<string>} columns
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.columns = $util.emptyArray;
    
                    /**
                     * ReadRequest keySet.
                     * @member {google.spanner.v1.IKeySet|null|undefined} keySet
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.keySet = null;
    
                    /**
                     * ReadRequest limit.
                     * @member {number|Long} limit
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.limit = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * ReadRequest resumeToken.
                     * @member {Uint8Array} resumeToken
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.resumeToken = $util.newBuffer([]);
    
                    /**
                     * ReadRequest partitionToken.
                     * @member {Uint8Array} partitionToken
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.partitionToken = $util.newBuffer([]);
    
                    /**
                     * ReadRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.requestOptions = null;
    
                    /**
                     * ReadRequest directedReadOptions.
                     * @member {google.spanner.v1.IDirectedReadOptions|null|undefined} directedReadOptions
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.directedReadOptions = null;
    
                    /**
                     * ReadRequest dataBoostEnabled.
                     * @member {boolean} dataBoostEnabled
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.dataBoostEnabled = false;
    
                    /**
                     * ReadRequest orderBy.
                     * @member {google.spanner.v1.ReadRequest.OrderBy} orderBy
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.orderBy = 0;
    
                    /**
                     * ReadRequest lockHint.
                     * @member {google.spanner.v1.ReadRequest.LockHint} lockHint
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     */
                    ReadRequest.prototype.lockHint = 0;
    
                    /**
                     * Creates a new ReadRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {google.spanner.v1.IReadRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.ReadRequest} ReadRequest instance
                     */
                    ReadRequest.create = function create(properties) {
                        return new ReadRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ReadRequest message. Does not implicitly {@link google.spanner.v1.ReadRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {google.spanner.v1.IReadRequest} message ReadRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReadRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.TransactionSelector.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.table);
                        if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.index);
                        if (message.columns != null && message.columns.length)
                            for (var i = 0; i < message.columns.length; ++i)
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.columns[i]);
                        if (message.keySet != null && Object.hasOwnProperty.call(message, "keySet"))
                            $root.google.spanner.v1.KeySet.encode(message.keySet, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        if (message.limit != null && Object.hasOwnProperty.call(message, "limit"))
                            writer.uint32(/* id 8, wireType 0 =*/64).int64(message.limit);
                        if (message.resumeToken != null && Object.hasOwnProperty.call(message, "resumeToken"))
                            writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.resumeToken);
                        if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                            writer.uint32(/* id 10, wireType 2 =*/82).bytes(message.partitionToken);
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                        if (message.directedReadOptions != null && Object.hasOwnProperty.call(message, "directedReadOptions"))
                            $root.google.spanner.v1.DirectedReadOptions.encode(message.directedReadOptions, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
                        if (message.dataBoostEnabled != null && Object.hasOwnProperty.call(message, "dataBoostEnabled"))
                            writer.uint32(/* id 15, wireType 0 =*/120).bool(message.dataBoostEnabled);
                        if (message.orderBy != null && Object.hasOwnProperty.call(message, "orderBy"))
                            writer.uint32(/* id 16, wireType 0 =*/128).int32(message.orderBy);
                        if (message.lockHint != null && Object.hasOwnProperty.call(message, "lockHint"))
                            writer.uint32(/* id 17, wireType 0 =*/136).int32(message.lockHint);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ReadRequest message, length delimited. Does not implicitly {@link google.spanner.v1.ReadRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {google.spanner.v1.IReadRequest} message ReadRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReadRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ReadRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ReadRequest} ReadRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReadRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ReadRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.TransactionSelector.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.table = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.index = reader.string();
                                    break;
                                }
                            case 5: {
                                    if (!(message.columns && message.columns.length))
                                        message.columns = [];
                                    message.columns.push(reader.string());
                                    break;
                                }
                            case 6: {
                                    message.keySet = $root.google.spanner.v1.KeySet.decode(reader, reader.uint32());
                                    break;
                                }
                            case 8: {
                                    message.limit = reader.int64();
                                    break;
                                }
                            case 9: {
                                    message.resumeToken = reader.bytes();
                                    break;
                                }
                            case 10: {
                                    message.partitionToken = reader.bytes();
                                    break;
                                }
                            case 11: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 14: {
                                    message.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 15: {
                                    message.dataBoostEnabled = reader.bool();
                                    break;
                                }
                            case 16: {
                                    message.orderBy = reader.int32();
                                    break;
                                }
                            case 17: {
                                    message.lockHint = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ReadRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ReadRequest} ReadRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReadRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ReadRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ReadRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.TransactionSelector.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.table != null && message.hasOwnProperty("table"))
                            if (!$util.isString(message.table))
                                return "table: string expected";
                        if (message.index != null && message.hasOwnProperty("index"))
                            if (!$util.isString(message.index))
                                return "index: string expected";
                        if (message.columns != null && message.hasOwnProperty("columns")) {
                            if (!Array.isArray(message.columns))
                                return "columns: array expected";
                            for (var i = 0; i < message.columns.length; ++i)
                                if (!$util.isString(message.columns[i]))
                                    return "columns: string[] expected";
                        }
                        if (message.keySet != null && message.hasOwnProperty("keySet")) {
                            var error = $root.google.spanner.v1.KeySet.verify(message.keySet);
                            if (error)
                                return "keySet." + error;
                        }
                        if (message.limit != null && message.hasOwnProperty("limit"))
                            if (!$util.isInteger(message.limit) && !(message.limit && $util.isInteger(message.limit.low) && $util.isInteger(message.limit.high)))
                                return "limit: integer|Long expected";
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            if (!(message.resumeToken && typeof message.resumeToken.length === "number" || $util.isString(message.resumeToken)))
                                return "resumeToken: buffer expected";
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            if (!(message.partitionToken && typeof message.partitionToken.length === "number" || $util.isString(message.partitionToken)))
                                return "partitionToken: buffer expected";
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.directedReadOptions != null && message.hasOwnProperty("directedReadOptions")) {
                            var error = $root.google.spanner.v1.DirectedReadOptions.verify(message.directedReadOptions);
                            if (error)
                                return "directedReadOptions." + error;
                        }
                        if (message.dataBoostEnabled != null && message.hasOwnProperty("dataBoostEnabled"))
                            if (typeof message.dataBoostEnabled !== "boolean")
                                return "dataBoostEnabled: boolean expected";
                        if (message.orderBy != null && message.hasOwnProperty("orderBy"))
                            switch (message.orderBy) {
                            default:
                                return "orderBy: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.lockHint != null && message.hasOwnProperty("lockHint"))
                            switch (message.lockHint) {
                            default:
                                return "lockHint: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        return null;
                    };
    
                    /**
                     * Creates a ReadRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ReadRequest} ReadRequest
                     */
                    ReadRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ReadRequest)
                            return object;
                        var message = new $root.google.spanner.v1.ReadRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.ReadRequest.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.TransactionSelector.fromObject(object.transaction);
                        }
                        if (object.table != null)
                            message.table = String(object.table);
                        if (object.index != null)
                            message.index = String(object.index);
                        if (object.columns) {
                            if (!Array.isArray(object.columns))
                                throw TypeError(".google.spanner.v1.ReadRequest.columns: array expected");
                            message.columns = [];
                            for (var i = 0; i < object.columns.length; ++i)
                                message.columns[i] = String(object.columns[i]);
                        }
                        if (object.keySet != null) {
                            if (typeof object.keySet !== "object")
                                throw TypeError(".google.spanner.v1.ReadRequest.keySet: object expected");
                            message.keySet = $root.google.spanner.v1.KeySet.fromObject(object.keySet);
                        }
                        if (object.limit != null)
                            if ($util.Long)
                                (message.limit = $util.Long.fromValue(object.limit)).unsigned = false;
                            else if (typeof object.limit === "string")
                                message.limit = parseInt(object.limit, 10);
                            else if (typeof object.limit === "number")
                                message.limit = object.limit;
                            else if (typeof object.limit === "object")
                                message.limit = new $util.LongBits(object.limit.low >>> 0, object.limit.high >>> 0).toNumber();
                        if (object.resumeToken != null)
                            if (typeof object.resumeToken === "string")
                                $util.base64.decode(object.resumeToken, message.resumeToken = $util.newBuffer($util.base64.length(object.resumeToken)), 0);
                            else if (object.resumeToken.length >= 0)
                                message.resumeToken = object.resumeToken;
                        if (object.partitionToken != null)
                            if (typeof object.partitionToken === "string")
                                $util.base64.decode(object.partitionToken, message.partitionToken = $util.newBuffer($util.base64.length(object.partitionToken)), 0);
                            else if (object.partitionToken.length >= 0)
                                message.partitionToken = object.partitionToken;
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.ReadRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.directedReadOptions != null) {
                            if (typeof object.directedReadOptions !== "object")
                                throw TypeError(".google.spanner.v1.ReadRequest.directedReadOptions: object expected");
                            message.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.fromObject(object.directedReadOptions);
                        }
                        if (object.dataBoostEnabled != null)
                            message.dataBoostEnabled = Boolean(object.dataBoostEnabled);
                        switch (object.orderBy) {
                        default:
                            if (typeof object.orderBy === "number") {
                                message.orderBy = object.orderBy;
                                break;
                            }
                            break;
                        case "ORDER_BY_UNSPECIFIED":
                        case 0:
                            message.orderBy = 0;
                            break;
                        case "ORDER_BY_PRIMARY_KEY":
                        case 1:
                            message.orderBy = 1;
                            break;
                        case "ORDER_BY_NO_ORDER":
                        case 2:
                            message.orderBy = 2;
                            break;
                        }
                        switch (object.lockHint) {
                        default:
                            if (typeof object.lockHint === "number") {
                                message.lockHint = object.lockHint;
                                break;
                            }
                            break;
                        case "LOCK_HINT_UNSPECIFIED":
                        case 0:
                            message.lockHint = 0;
                            break;
                        case "LOCK_HINT_SHARED":
                        case 1:
                            message.lockHint = 1;
                            break;
                        case "LOCK_HINT_EXCLUSIVE":
                        case 2:
                            message.lockHint = 2;
                            break;
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ReadRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {google.spanner.v1.ReadRequest} message ReadRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ReadRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.columns = [];
                        if (options.defaults) {
                            object.session = "";
                            object.transaction = null;
                            object.table = "";
                            object.index = "";
                            object.keySet = null;
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.limit = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.limit = options.longs === String ? "0" : 0;
                            if (options.bytes === String)
                                object.resumeToken = "";
                            else {
                                object.resumeToken = [];
                                if (options.bytes !== Array)
                                    object.resumeToken = $util.newBuffer(object.resumeToken);
                            }
                            if (options.bytes === String)
                                object.partitionToken = "";
                            else {
                                object.partitionToken = [];
                                if (options.bytes !== Array)
                                    object.partitionToken = $util.newBuffer(object.partitionToken);
                            }
                            object.requestOptions = null;
                            object.directedReadOptions = null;
                            object.dataBoostEnabled = false;
                            object.orderBy = options.enums === String ? "ORDER_BY_UNSPECIFIED" : 0;
                            object.lockHint = options.enums === String ? "LOCK_HINT_UNSPECIFIED" : 0;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.TransactionSelector.toObject(message.transaction, options);
                        if (message.table != null && message.hasOwnProperty("table"))
                            object.table = message.table;
                        if (message.index != null && message.hasOwnProperty("index"))
                            object.index = message.index;
                        if (message.columns && message.columns.length) {
                            object.columns = [];
                            for (var j = 0; j < message.columns.length; ++j)
                                object.columns[j] = message.columns[j];
                        }
                        if (message.keySet != null && message.hasOwnProperty("keySet"))
                            object.keySet = $root.google.spanner.v1.KeySet.toObject(message.keySet, options);
                        if (message.limit != null && message.hasOwnProperty("limit"))
                            if (typeof message.limit === "number")
                                object.limit = options.longs === String ? String(message.limit) : message.limit;
                            else
                                object.limit = options.longs === String ? $util.Long.prototype.toString.call(message.limit) : options.longs === Number ? new $util.LongBits(message.limit.low >>> 0, message.limit.high >>> 0).toNumber() : message.limit;
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            object.resumeToken = options.bytes === String ? $util.base64.encode(message.resumeToken, 0, message.resumeToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.resumeToken) : message.resumeToken;
                        if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                            object.partitionToken = options.bytes === String ? $util.base64.encode(message.partitionToken, 0, message.partitionToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.partitionToken) : message.partitionToken;
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.directedReadOptions != null && message.hasOwnProperty("directedReadOptions"))
                            object.directedReadOptions = $root.google.spanner.v1.DirectedReadOptions.toObject(message.directedReadOptions, options);
                        if (message.dataBoostEnabled != null && message.hasOwnProperty("dataBoostEnabled"))
                            object.dataBoostEnabled = message.dataBoostEnabled;
                        if (message.orderBy != null && message.hasOwnProperty("orderBy"))
                            object.orderBy = options.enums === String ? $root.google.spanner.v1.ReadRequest.OrderBy[message.orderBy] === undefined ? message.orderBy : $root.google.spanner.v1.ReadRequest.OrderBy[message.orderBy] : message.orderBy;
                        if (message.lockHint != null && message.hasOwnProperty("lockHint"))
                            object.lockHint = options.enums === String ? $root.google.spanner.v1.ReadRequest.LockHint[message.lockHint] === undefined ? message.lockHint : $root.google.spanner.v1.ReadRequest.LockHint[message.lockHint] : message.lockHint;
                        return object;
                    };
    
                    /**
                     * Converts this ReadRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ReadRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ReadRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ReadRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ReadRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ReadRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ReadRequest";
                    };
    
                    /**
                     * OrderBy enum.
                     * @name google.spanner.v1.ReadRequest.OrderBy
                     * @enum {number}
                     * @property {number} ORDER_BY_UNSPECIFIED=0 ORDER_BY_UNSPECIFIED value
                     * @property {number} ORDER_BY_PRIMARY_KEY=1 ORDER_BY_PRIMARY_KEY value
                     * @property {number} ORDER_BY_NO_ORDER=2 ORDER_BY_NO_ORDER value
                     */
                    ReadRequest.OrderBy = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "ORDER_BY_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "ORDER_BY_PRIMARY_KEY"] = 1;
                        values[valuesById[2] = "ORDER_BY_NO_ORDER"] = 2;
                        return values;
                    })();
    
                    /**
                     * LockHint enum.
                     * @name google.spanner.v1.ReadRequest.LockHint
                     * @enum {number}
                     * @property {number} LOCK_HINT_UNSPECIFIED=0 LOCK_HINT_UNSPECIFIED value
                     * @property {number} LOCK_HINT_SHARED=1 LOCK_HINT_SHARED value
                     * @property {number} LOCK_HINT_EXCLUSIVE=2 LOCK_HINT_EXCLUSIVE value
                     */
                    ReadRequest.LockHint = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "LOCK_HINT_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "LOCK_HINT_SHARED"] = 1;
                        values[valuesById[2] = "LOCK_HINT_EXCLUSIVE"] = 2;
                        return values;
                    })();
    
                    return ReadRequest;
                })();
    
                v1.BeginTransactionRequest = (function() {
    
                    /**
                     * Properties of a BeginTransactionRequest.
                     * @memberof google.spanner.v1
                     * @interface IBeginTransactionRequest
                     * @property {string|null} [session] BeginTransactionRequest session
                     * @property {google.spanner.v1.ITransactionOptions|null} [options] BeginTransactionRequest options
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] BeginTransactionRequest requestOptions
                     * @property {google.spanner.v1.IMutation|null} [mutationKey] BeginTransactionRequest mutationKey
                     */
    
                    /**
                     * Constructs a new BeginTransactionRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a BeginTransactionRequest.
                     * @implements IBeginTransactionRequest
                     * @constructor
                     * @param {google.spanner.v1.IBeginTransactionRequest=} [properties] Properties to set
                     */
                    function BeginTransactionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BeginTransactionRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @instance
                     */
                    BeginTransactionRequest.prototype.session = "";
    
                    /**
                     * BeginTransactionRequest options.
                     * @member {google.spanner.v1.ITransactionOptions|null|undefined} options
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @instance
                     */
                    BeginTransactionRequest.prototype.options = null;
    
                    /**
                     * BeginTransactionRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @instance
                     */
                    BeginTransactionRequest.prototype.requestOptions = null;
    
                    /**
                     * BeginTransactionRequest mutationKey.
                     * @member {google.spanner.v1.IMutation|null|undefined} mutationKey
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @instance
                     */
                    BeginTransactionRequest.prototype.mutationKey = null;
    
                    /**
                     * Creates a new BeginTransactionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {google.spanner.v1.IBeginTransactionRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.BeginTransactionRequest} BeginTransactionRequest instance
                     */
                    BeginTransactionRequest.create = function create(properties) {
                        return new BeginTransactionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified BeginTransactionRequest message. Does not implicitly {@link google.spanner.v1.BeginTransactionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {google.spanner.v1.IBeginTransactionRequest} message BeginTransactionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BeginTransactionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                            $root.google.spanner.v1.TransactionOptions.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.mutationKey != null && Object.hasOwnProperty.call(message, "mutationKey"))
                            $root.google.spanner.v1.Mutation.encode(message.mutationKey, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BeginTransactionRequest message, length delimited. Does not implicitly {@link google.spanner.v1.BeginTransactionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {google.spanner.v1.IBeginTransactionRequest} message BeginTransactionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BeginTransactionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BeginTransactionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.BeginTransactionRequest} BeginTransactionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BeginTransactionRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BeginTransactionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.options = $root.google.spanner.v1.TransactionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.mutationKey = $root.google.spanner.v1.Mutation.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BeginTransactionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.BeginTransactionRequest} BeginTransactionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BeginTransactionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BeginTransactionRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BeginTransactionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.options != null && message.hasOwnProperty("options")) {
                            var error = $root.google.spanner.v1.TransactionOptions.verify(message.options);
                            if (error)
                                return "options." + error;
                        }
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.mutationKey != null && message.hasOwnProperty("mutationKey")) {
                            var error = $root.google.spanner.v1.Mutation.verify(message.mutationKey);
                            if (error)
                                return "mutationKey." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a BeginTransactionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.BeginTransactionRequest} BeginTransactionRequest
                     */
                    BeginTransactionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.BeginTransactionRequest)
                            return object;
                        var message = new $root.google.spanner.v1.BeginTransactionRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.options != null) {
                            if (typeof object.options !== "object")
                                throw TypeError(".google.spanner.v1.BeginTransactionRequest.options: object expected");
                            message.options = $root.google.spanner.v1.TransactionOptions.fromObject(object.options);
                        }
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.BeginTransactionRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.mutationKey != null) {
                            if (typeof object.mutationKey !== "object")
                                throw TypeError(".google.spanner.v1.BeginTransactionRequest.mutationKey: object expected");
                            message.mutationKey = $root.google.spanner.v1.Mutation.fromObject(object.mutationKey);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BeginTransactionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {google.spanner.v1.BeginTransactionRequest} message BeginTransactionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BeginTransactionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.session = "";
                            object.options = null;
                            object.requestOptions = null;
                            object.mutationKey = null;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.options != null && message.hasOwnProperty("options"))
                            object.options = $root.google.spanner.v1.TransactionOptions.toObject(message.options, options);
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.mutationKey != null && message.hasOwnProperty("mutationKey"))
                            object.mutationKey = $root.google.spanner.v1.Mutation.toObject(message.mutationKey, options);
                        return object;
                    };
    
                    /**
                     * Converts this BeginTransactionRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BeginTransactionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BeginTransactionRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.BeginTransactionRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BeginTransactionRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.BeginTransactionRequest";
                    };
    
                    return BeginTransactionRequest;
                })();
    
                v1.CommitRequest = (function() {
    
                    /**
                     * Properties of a CommitRequest.
                     * @memberof google.spanner.v1
                     * @interface ICommitRequest
                     * @property {string|null} [session] CommitRequest session
                     * @property {Uint8Array|null} [transactionId] CommitRequest transactionId
                     * @property {google.spanner.v1.ITransactionOptions|null} [singleUseTransaction] CommitRequest singleUseTransaction
                     * @property {Array.<google.spanner.v1.IMutation>|null} [mutations] CommitRequest mutations
                     * @property {boolean|null} [returnCommitStats] CommitRequest returnCommitStats
                     * @property {google.protobuf.IDuration|null} [maxCommitDelay] CommitRequest maxCommitDelay
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] CommitRequest requestOptions
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] CommitRequest precommitToken
                     */
    
                    /**
                     * Constructs a new CommitRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a CommitRequest.
                     * @implements ICommitRequest
                     * @constructor
                     * @param {google.spanner.v1.ICommitRequest=} [properties] Properties to set
                     */
                    function CommitRequest(properties) {
                        this.mutations = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CommitRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.session = "";
    
                    /**
                     * CommitRequest transactionId.
                     * @member {Uint8Array|null|undefined} transactionId
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.transactionId = null;
    
                    /**
                     * CommitRequest singleUseTransaction.
                     * @member {google.spanner.v1.ITransactionOptions|null|undefined} singleUseTransaction
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.singleUseTransaction = null;
    
                    /**
                     * CommitRequest mutations.
                     * @member {Array.<google.spanner.v1.IMutation>} mutations
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.mutations = $util.emptyArray;
    
                    /**
                     * CommitRequest returnCommitStats.
                     * @member {boolean} returnCommitStats
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.returnCommitStats = false;
    
                    /**
                     * CommitRequest maxCommitDelay.
                     * @member {google.protobuf.IDuration|null|undefined} maxCommitDelay
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.maxCommitDelay = null;
    
                    /**
                     * CommitRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.requestOptions = null;
    
                    /**
                     * CommitRequest precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    CommitRequest.prototype.precommitToken = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * CommitRequest transaction.
                     * @member {"transactionId"|"singleUseTransaction"|undefined} transaction
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     */
                    Object.defineProperty(CommitRequest.prototype, "transaction", {
                        get: $util.oneOfGetter($oneOfFields = ["transactionId", "singleUseTransaction"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new CommitRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {google.spanner.v1.ICommitRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.CommitRequest} CommitRequest instance
                     */
                    CommitRequest.create = function create(properties) {
                        return new CommitRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CommitRequest message. Does not implicitly {@link google.spanner.v1.CommitRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {google.spanner.v1.ICommitRequest} message CommitRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CommitRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transactionId != null && Object.hasOwnProperty.call(message, "transactionId"))
                            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.transactionId);
                        if (message.singleUseTransaction != null && Object.hasOwnProperty.call(message, "singleUseTransaction"))
                            $root.google.spanner.v1.TransactionOptions.encode(message.singleUseTransaction, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.mutations != null && message.mutations.length)
                            for (var i = 0; i < message.mutations.length; ++i)
                                $root.google.spanner.v1.Mutation.encode(message.mutations[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.returnCommitStats != null && Object.hasOwnProperty.call(message, "returnCommitStats"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.returnCommitStats);
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        if (message.maxCommitDelay != null && Object.hasOwnProperty.call(message, "maxCommitDelay"))
                            $root.google.protobuf.Duration.encode(message.maxCommitDelay, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CommitRequest message, length delimited. Does not implicitly {@link google.spanner.v1.CommitRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {google.spanner.v1.ICommitRequest} message CommitRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CommitRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CommitRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.CommitRequest} CommitRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CommitRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.CommitRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transactionId = reader.bytes();
                                    break;
                                }
                            case 3: {
                                    message.singleUseTransaction = $root.google.spanner.v1.TransactionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    if (!(message.mutations && message.mutations.length))
                                        message.mutations = [];
                                    message.mutations.push($root.google.spanner.v1.Mutation.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 5: {
                                    message.returnCommitStats = reader.bool();
                                    break;
                                }
                            case 8: {
                                    message.maxCommitDelay = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                    break;
                                }
                            case 6: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 9: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CommitRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.CommitRequest} CommitRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CommitRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CommitRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CommitRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transactionId != null && message.hasOwnProperty("transactionId")) {
                            properties.transaction = 1;
                            if (!(message.transactionId && typeof message.transactionId.length === "number" || $util.isString(message.transactionId)))
                                return "transactionId: buffer expected";
                        }
                        if (message.singleUseTransaction != null && message.hasOwnProperty("singleUseTransaction")) {
                            if (properties.transaction === 1)
                                return "transaction: multiple values";
                            properties.transaction = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.verify(message.singleUseTransaction);
                                if (error)
                                    return "singleUseTransaction." + error;
                            }
                        }
                        if (message.mutations != null && message.hasOwnProperty("mutations")) {
                            if (!Array.isArray(message.mutations))
                                return "mutations: array expected";
                            for (var i = 0; i < message.mutations.length; ++i) {
                                var error = $root.google.spanner.v1.Mutation.verify(message.mutations[i]);
                                if (error)
                                    return "mutations." + error;
                            }
                        }
                        if (message.returnCommitStats != null && message.hasOwnProperty("returnCommitStats"))
                            if (typeof message.returnCommitStats !== "boolean")
                                return "returnCommitStats: boolean expected";
                        if (message.maxCommitDelay != null && message.hasOwnProperty("maxCommitDelay")) {
                            var error = $root.google.protobuf.Duration.verify(message.maxCommitDelay);
                            if (error)
                                return "maxCommitDelay." + error;
                        }
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                            if (error)
                                return "precommitToken." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CommitRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.CommitRequest} CommitRequest
                     */
                    CommitRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.CommitRequest)
                            return object;
                        var message = new $root.google.spanner.v1.CommitRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transactionId != null)
                            if (typeof object.transactionId === "string")
                                $util.base64.decode(object.transactionId, message.transactionId = $util.newBuffer($util.base64.length(object.transactionId)), 0);
                            else if (object.transactionId.length >= 0)
                                message.transactionId = object.transactionId;
                        if (object.singleUseTransaction != null) {
                            if (typeof object.singleUseTransaction !== "object")
                                throw TypeError(".google.spanner.v1.CommitRequest.singleUseTransaction: object expected");
                            message.singleUseTransaction = $root.google.spanner.v1.TransactionOptions.fromObject(object.singleUseTransaction);
                        }
                        if (object.mutations) {
                            if (!Array.isArray(object.mutations))
                                throw TypeError(".google.spanner.v1.CommitRequest.mutations: array expected");
                            message.mutations = [];
                            for (var i = 0; i < object.mutations.length; ++i) {
                                if (typeof object.mutations[i] !== "object")
                                    throw TypeError(".google.spanner.v1.CommitRequest.mutations: object expected");
                                message.mutations[i] = $root.google.spanner.v1.Mutation.fromObject(object.mutations[i]);
                            }
                        }
                        if (object.returnCommitStats != null)
                            message.returnCommitStats = Boolean(object.returnCommitStats);
                        if (object.maxCommitDelay != null) {
                            if (typeof object.maxCommitDelay !== "object")
                                throw TypeError(".google.spanner.v1.CommitRequest.maxCommitDelay: object expected");
                            message.maxCommitDelay = $root.google.protobuf.Duration.fromObject(object.maxCommitDelay);
                        }
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.CommitRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.CommitRequest.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CommitRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {google.spanner.v1.CommitRequest} message CommitRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CommitRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.mutations = [];
                        if (options.defaults) {
                            object.session = "";
                            object.returnCommitStats = false;
                            object.requestOptions = null;
                            object.maxCommitDelay = null;
                            object.precommitToken = null;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transactionId != null && message.hasOwnProperty("transactionId")) {
                            object.transactionId = options.bytes === String ? $util.base64.encode(message.transactionId, 0, message.transactionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.transactionId) : message.transactionId;
                            if (options.oneofs)
                                object.transaction = "transactionId";
                        }
                        if (message.singleUseTransaction != null && message.hasOwnProperty("singleUseTransaction")) {
                            object.singleUseTransaction = $root.google.spanner.v1.TransactionOptions.toObject(message.singleUseTransaction, options);
                            if (options.oneofs)
                                object.transaction = "singleUseTransaction";
                        }
                        if (message.mutations && message.mutations.length) {
                            object.mutations = [];
                            for (var j = 0; j < message.mutations.length; ++j)
                                object.mutations[j] = $root.google.spanner.v1.Mutation.toObject(message.mutations[j], options);
                        }
                        if (message.returnCommitStats != null && message.hasOwnProperty("returnCommitStats"))
                            object.returnCommitStats = message.returnCommitStats;
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.maxCommitDelay != null && message.hasOwnProperty("maxCommitDelay"))
                            object.maxCommitDelay = $root.google.protobuf.Duration.toObject(message.maxCommitDelay, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                        return object;
                    };
    
                    /**
                     * Converts this CommitRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.CommitRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CommitRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for CommitRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.CommitRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    CommitRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.CommitRequest";
                    };
    
                    return CommitRequest;
                })();
    
                v1.RollbackRequest = (function() {
    
                    /**
                     * Properties of a RollbackRequest.
                     * @memberof google.spanner.v1
                     * @interface IRollbackRequest
                     * @property {string|null} [session] RollbackRequest session
                     * @property {Uint8Array|null} [transactionId] RollbackRequest transactionId
                     */
    
                    /**
                     * Constructs a new RollbackRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a RollbackRequest.
                     * @implements IRollbackRequest
                     * @constructor
                     * @param {google.spanner.v1.IRollbackRequest=} [properties] Properties to set
                     */
                    function RollbackRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * RollbackRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.RollbackRequest
                     * @instance
                     */
                    RollbackRequest.prototype.session = "";
    
                    /**
                     * RollbackRequest transactionId.
                     * @member {Uint8Array} transactionId
                     * @memberof google.spanner.v1.RollbackRequest
                     * @instance
                     */
                    RollbackRequest.prototype.transactionId = $util.newBuffer([]);
    
                    /**
                     * Creates a new RollbackRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {google.spanner.v1.IRollbackRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.RollbackRequest} RollbackRequest instance
                     */
                    RollbackRequest.create = function create(properties) {
                        return new RollbackRequest(properties);
                    };
    
                    /**
                     * Encodes the specified RollbackRequest message. Does not implicitly {@link google.spanner.v1.RollbackRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {google.spanner.v1.IRollbackRequest} message RollbackRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    RollbackRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.transactionId != null && Object.hasOwnProperty.call(message, "transactionId"))
                            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.transactionId);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified RollbackRequest message, length delimited. Does not implicitly {@link google.spanner.v1.RollbackRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {google.spanner.v1.IRollbackRequest} message RollbackRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    RollbackRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a RollbackRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.RollbackRequest} RollbackRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    RollbackRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.RollbackRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.transactionId = reader.bytes();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a RollbackRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.RollbackRequest} RollbackRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    RollbackRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a RollbackRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    RollbackRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.transactionId != null && message.hasOwnProperty("transactionId"))
                            if (!(message.transactionId && typeof message.transactionId.length === "number" || $util.isString(message.transactionId)))
                                return "transactionId: buffer expected";
                        return null;
                    };
    
                    /**
                     * Creates a RollbackRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.RollbackRequest} RollbackRequest
                     */
                    RollbackRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.RollbackRequest)
                            return object;
                        var message = new $root.google.spanner.v1.RollbackRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.transactionId != null)
                            if (typeof object.transactionId === "string")
                                $util.base64.decode(object.transactionId, message.transactionId = $util.newBuffer($util.base64.length(object.transactionId)), 0);
                            else if (object.transactionId.length >= 0)
                                message.transactionId = object.transactionId;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a RollbackRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {google.spanner.v1.RollbackRequest} message RollbackRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    RollbackRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.session = "";
                            if (options.bytes === String)
                                object.transactionId = "";
                            else {
                                object.transactionId = [];
                                if (options.bytes !== Array)
                                    object.transactionId = $util.newBuffer(object.transactionId);
                            }
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.transactionId != null && message.hasOwnProperty("transactionId"))
                            object.transactionId = options.bytes === String ? $util.base64.encode(message.transactionId, 0, message.transactionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.transactionId) : message.transactionId;
                        return object;
                    };
    
                    /**
                     * Converts this RollbackRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.RollbackRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    RollbackRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for RollbackRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.RollbackRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    RollbackRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.RollbackRequest";
                    };
    
                    return RollbackRequest;
                })();
    
                v1.BatchWriteRequest = (function() {
    
                    /**
                     * Properties of a BatchWriteRequest.
                     * @memberof google.spanner.v1
                     * @interface IBatchWriteRequest
                     * @property {string|null} [session] BatchWriteRequest session
                     * @property {google.spanner.v1.IRequestOptions|null} [requestOptions] BatchWriteRequest requestOptions
                     * @property {Array.<google.spanner.v1.BatchWriteRequest.IMutationGroup>|null} [mutationGroups] BatchWriteRequest mutationGroups
                     * @property {boolean|null} [excludeTxnFromChangeStreams] BatchWriteRequest excludeTxnFromChangeStreams
                     */
    
                    /**
                     * Constructs a new BatchWriteRequest.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a BatchWriteRequest.
                     * @implements IBatchWriteRequest
                     * @constructor
                     * @param {google.spanner.v1.IBatchWriteRequest=} [properties] Properties to set
                     */
                    function BatchWriteRequest(properties) {
                        this.mutationGroups = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BatchWriteRequest session.
                     * @member {string} session
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @instance
                     */
                    BatchWriteRequest.prototype.session = "";
    
                    /**
                     * BatchWriteRequest requestOptions.
                     * @member {google.spanner.v1.IRequestOptions|null|undefined} requestOptions
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @instance
                     */
                    BatchWriteRequest.prototype.requestOptions = null;
    
                    /**
                     * BatchWriteRequest mutationGroups.
                     * @member {Array.<google.spanner.v1.BatchWriteRequest.IMutationGroup>} mutationGroups
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @instance
                     */
                    BatchWriteRequest.prototype.mutationGroups = $util.emptyArray;
    
                    /**
                     * BatchWriteRequest excludeTxnFromChangeStreams.
                     * @member {boolean} excludeTxnFromChangeStreams
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @instance
                     */
                    BatchWriteRequest.prototype.excludeTxnFromChangeStreams = false;
    
                    /**
                     * Creates a new BatchWriteRequest instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {google.spanner.v1.IBatchWriteRequest=} [properties] Properties to set
                     * @returns {google.spanner.v1.BatchWriteRequest} BatchWriteRequest instance
                     */
                    BatchWriteRequest.create = function create(properties) {
                        return new BatchWriteRequest(properties);
                    };
    
                    /**
                     * Encodes the specified BatchWriteRequest message. Does not implicitly {@link google.spanner.v1.BatchWriteRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {google.spanner.v1.IBatchWriteRequest} message BatchWriteRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchWriteRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.session != null && Object.hasOwnProperty.call(message, "session"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.session);
                        if (message.requestOptions != null && Object.hasOwnProperty.call(message, "requestOptions"))
                            $root.google.spanner.v1.RequestOptions.encode(message.requestOptions, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.mutationGroups != null && message.mutationGroups.length)
                            for (var i = 0; i < message.mutationGroups.length; ++i)
                                $root.google.spanner.v1.BatchWriteRequest.MutationGroup.encode(message.mutationGroups[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.excludeTxnFromChangeStreams != null && Object.hasOwnProperty.call(message, "excludeTxnFromChangeStreams"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.excludeTxnFromChangeStreams);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BatchWriteRequest message, length delimited. Does not implicitly {@link google.spanner.v1.BatchWriteRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {google.spanner.v1.IBatchWriteRequest} message BatchWriteRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchWriteRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BatchWriteRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.BatchWriteRequest} BatchWriteRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchWriteRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BatchWriteRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.session = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.requestOptions = $root.google.spanner.v1.RequestOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    if (!(message.mutationGroups && message.mutationGroups.length))
                                        message.mutationGroups = [];
                                    message.mutationGroups.push($root.google.spanner.v1.BatchWriteRequest.MutationGroup.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 5: {
                                    message.excludeTxnFromChangeStreams = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BatchWriteRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.BatchWriteRequest} BatchWriteRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchWriteRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BatchWriteRequest message.
                     * @function verify
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BatchWriteRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.session != null && message.hasOwnProperty("session"))
                            if (!$util.isString(message.session))
                                return "session: string expected";
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions")) {
                            var error = $root.google.spanner.v1.RequestOptions.verify(message.requestOptions);
                            if (error)
                                return "requestOptions." + error;
                        }
                        if (message.mutationGroups != null && message.hasOwnProperty("mutationGroups")) {
                            if (!Array.isArray(message.mutationGroups))
                                return "mutationGroups: array expected";
                            for (var i = 0; i < message.mutationGroups.length; ++i) {
                                var error = $root.google.spanner.v1.BatchWriteRequest.MutationGroup.verify(message.mutationGroups[i]);
                                if (error)
                                    return "mutationGroups." + error;
                            }
                        }
                        if (message.excludeTxnFromChangeStreams != null && message.hasOwnProperty("excludeTxnFromChangeStreams"))
                            if (typeof message.excludeTxnFromChangeStreams !== "boolean")
                                return "excludeTxnFromChangeStreams: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a BatchWriteRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.BatchWriteRequest} BatchWriteRequest
                     */
                    BatchWriteRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.BatchWriteRequest)
                            return object;
                        var message = new $root.google.spanner.v1.BatchWriteRequest();
                        if (object.session != null)
                            message.session = String(object.session);
                        if (object.requestOptions != null) {
                            if (typeof object.requestOptions !== "object")
                                throw TypeError(".google.spanner.v1.BatchWriteRequest.requestOptions: object expected");
                            message.requestOptions = $root.google.spanner.v1.RequestOptions.fromObject(object.requestOptions);
                        }
                        if (object.mutationGroups) {
                            if (!Array.isArray(object.mutationGroups))
                                throw TypeError(".google.spanner.v1.BatchWriteRequest.mutationGroups: array expected");
                            message.mutationGroups = [];
                            for (var i = 0; i < object.mutationGroups.length; ++i) {
                                if (typeof object.mutationGroups[i] !== "object")
                                    throw TypeError(".google.spanner.v1.BatchWriteRequest.mutationGroups: object expected");
                                message.mutationGroups[i] = $root.google.spanner.v1.BatchWriteRequest.MutationGroup.fromObject(object.mutationGroups[i]);
                            }
                        }
                        if (object.excludeTxnFromChangeStreams != null)
                            message.excludeTxnFromChangeStreams = Boolean(object.excludeTxnFromChangeStreams);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BatchWriteRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {google.spanner.v1.BatchWriteRequest} message BatchWriteRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BatchWriteRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.mutationGroups = [];
                        if (options.defaults) {
                            object.session = "";
                            object.requestOptions = null;
                            object.excludeTxnFromChangeStreams = false;
                        }
                        if (message.session != null && message.hasOwnProperty("session"))
                            object.session = message.session;
                        if (message.requestOptions != null && message.hasOwnProperty("requestOptions"))
                            object.requestOptions = $root.google.spanner.v1.RequestOptions.toObject(message.requestOptions, options);
                        if (message.mutationGroups && message.mutationGroups.length) {
                            object.mutationGroups = [];
                            for (var j = 0; j < message.mutationGroups.length; ++j)
                                object.mutationGroups[j] = $root.google.spanner.v1.BatchWriteRequest.MutationGroup.toObject(message.mutationGroups[j], options);
                        }
                        if (message.excludeTxnFromChangeStreams != null && message.hasOwnProperty("excludeTxnFromChangeStreams"))
                            object.excludeTxnFromChangeStreams = message.excludeTxnFromChangeStreams;
                        return object;
                    };
    
                    /**
                     * Converts this BatchWriteRequest to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BatchWriteRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BatchWriteRequest
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.BatchWriteRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BatchWriteRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.BatchWriteRequest";
                    };
    
                    BatchWriteRequest.MutationGroup = (function() {
    
                        /**
                         * Properties of a MutationGroup.
                         * @memberof google.spanner.v1.BatchWriteRequest
                         * @interface IMutationGroup
                         * @property {Array.<google.spanner.v1.IMutation>|null} [mutations] MutationGroup mutations
                         */
    
                        /**
                         * Constructs a new MutationGroup.
                         * @memberof google.spanner.v1.BatchWriteRequest
                         * @classdesc Represents a MutationGroup.
                         * @implements IMutationGroup
                         * @constructor
                         * @param {google.spanner.v1.BatchWriteRequest.IMutationGroup=} [properties] Properties to set
                         */
                        function MutationGroup(properties) {
                            this.mutations = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * MutationGroup mutations.
                         * @member {Array.<google.spanner.v1.IMutation>} mutations
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @instance
                         */
                        MutationGroup.prototype.mutations = $util.emptyArray;
    
                        /**
                         * Creates a new MutationGroup instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {google.spanner.v1.BatchWriteRequest.IMutationGroup=} [properties] Properties to set
                         * @returns {google.spanner.v1.BatchWriteRequest.MutationGroup} MutationGroup instance
                         */
                        MutationGroup.create = function create(properties) {
                            return new MutationGroup(properties);
                        };
    
                        /**
                         * Encodes the specified MutationGroup message. Does not implicitly {@link google.spanner.v1.BatchWriteRequest.MutationGroup.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {google.spanner.v1.BatchWriteRequest.IMutationGroup} message MutationGroup message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        MutationGroup.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.mutations != null && message.mutations.length)
                                for (var i = 0; i < message.mutations.length; ++i)
                                    $root.google.spanner.v1.Mutation.encode(message.mutations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified MutationGroup message, length delimited. Does not implicitly {@link google.spanner.v1.BatchWriteRequest.MutationGroup.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {google.spanner.v1.BatchWriteRequest.IMutationGroup} message MutationGroup message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        MutationGroup.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a MutationGroup message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.BatchWriteRequest.MutationGroup} MutationGroup
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        MutationGroup.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BatchWriteRequest.MutationGroup();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        if (!(message.mutations && message.mutations.length))
                                            message.mutations = [];
                                        message.mutations.push($root.google.spanner.v1.Mutation.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a MutationGroup message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.BatchWriteRequest.MutationGroup} MutationGroup
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        MutationGroup.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a MutationGroup message.
                         * @function verify
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        MutationGroup.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.mutations != null && message.hasOwnProperty("mutations")) {
                                if (!Array.isArray(message.mutations))
                                    return "mutations: array expected";
                                for (var i = 0; i < message.mutations.length; ++i) {
                                    var error = $root.google.spanner.v1.Mutation.verify(message.mutations[i]);
                                    if (error)
                                        return "mutations." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a MutationGroup message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.BatchWriteRequest.MutationGroup} MutationGroup
                         */
                        MutationGroup.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.BatchWriteRequest.MutationGroup)
                                return object;
                            var message = new $root.google.spanner.v1.BatchWriteRequest.MutationGroup();
                            if (object.mutations) {
                                if (!Array.isArray(object.mutations))
                                    throw TypeError(".google.spanner.v1.BatchWriteRequest.MutationGroup.mutations: array expected");
                                message.mutations = [];
                                for (var i = 0; i < object.mutations.length; ++i) {
                                    if (typeof object.mutations[i] !== "object")
                                        throw TypeError(".google.spanner.v1.BatchWriteRequest.MutationGroup.mutations: object expected");
                                    message.mutations[i] = $root.google.spanner.v1.Mutation.fromObject(object.mutations[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a MutationGroup message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {google.spanner.v1.BatchWriteRequest.MutationGroup} message MutationGroup
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        MutationGroup.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.mutations = [];
                            if (message.mutations && message.mutations.length) {
                                object.mutations = [];
                                for (var j = 0; j < message.mutations.length; ++j)
                                    object.mutations[j] = $root.google.spanner.v1.Mutation.toObject(message.mutations[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this MutationGroup to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        MutationGroup.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for MutationGroup
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.BatchWriteRequest.MutationGroup
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        MutationGroup.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.BatchWriteRequest.MutationGroup";
                        };
    
                        return MutationGroup;
                    })();
    
                    return BatchWriteRequest;
                })();
    
                v1.BatchWriteResponse = (function() {
    
                    /**
                     * Properties of a BatchWriteResponse.
                     * @memberof google.spanner.v1
                     * @interface IBatchWriteResponse
                     * @property {Array.<number>|null} [indexes] BatchWriteResponse indexes
                     * @property {google.rpc.IStatus|null} [status] BatchWriteResponse status
                     * @property {google.protobuf.ITimestamp|null} [commitTimestamp] BatchWriteResponse commitTimestamp
                     */
    
                    /**
                     * Constructs a new BatchWriteResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a BatchWriteResponse.
                     * @implements IBatchWriteResponse
                     * @constructor
                     * @param {google.spanner.v1.IBatchWriteResponse=} [properties] Properties to set
                     */
                    function BatchWriteResponse(properties) {
                        this.indexes = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BatchWriteResponse indexes.
                     * @member {Array.<number>} indexes
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @instance
                     */
                    BatchWriteResponse.prototype.indexes = $util.emptyArray;
    
                    /**
                     * BatchWriteResponse status.
                     * @member {google.rpc.IStatus|null|undefined} status
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @instance
                     */
                    BatchWriteResponse.prototype.status = null;
    
                    /**
                     * BatchWriteResponse commitTimestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} commitTimestamp
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @instance
                     */
                    BatchWriteResponse.prototype.commitTimestamp = null;
    
                    /**
                     * Creates a new BatchWriteResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {google.spanner.v1.IBatchWriteResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.BatchWriteResponse} BatchWriteResponse instance
                     */
                    BatchWriteResponse.create = function create(properties) {
                        return new BatchWriteResponse(properties);
                    };
    
                    /**
                     * Encodes the specified BatchWriteResponse message. Does not implicitly {@link google.spanner.v1.BatchWriteResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {google.spanner.v1.IBatchWriteResponse} message BatchWriteResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchWriteResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.indexes != null && message.indexes.length) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork();
                            for (var i = 0; i < message.indexes.length; ++i)
                                writer.int32(message.indexes[i]);
                            writer.ldelim();
                        }
                        if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                            $root.google.rpc.Status.encode(message.status, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.commitTimestamp != null && Object.hasOwnProperty.call(message, "commitTimestamp"))
                            $root.google.protobuf.Timestamp.encode(message.commitTimestamp, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BatchWriteResponse message, length delimited. Does not implicitly {@link google.spanner.v1.BatchWriteResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {google.spanner.v1.IBatchWriteResponse} message BatchWriteResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BatchWriteResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BatchWriteResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.BatchWriteResponse} BatchWriteResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchWriteResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.BatchWriteResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.indexes && message.indexes.length))
                                        message.indexes = [];
                                    if ((tag & 7) === 2) {
                                        var end2 = reader.uint32() + reader.pos;
                                        while (reader.pos < end2)
                                            message.indexes.push(reader.int32());
                                    } else
                                        message.indexes.push(reader.int32());
                                    break;
                                }
                            case 2: {
                                    message.status = $root.google.rpc.Status.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.commitTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BatchWriteResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.BatchWriteResponse} BatchWriteResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BatchWriteResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BatchWriteResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BatchWriteResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.indexes != null && message.hasOwnProperty("indexes")) {
                            if (!Array.isArray(message.indexes))
                                return "indexes: array expected";
                            for (var i = 0; i < message.indexes.length; ++i)
                                if (!$util.isInteger(message.indexes[i]))
                                    return "indexes: integer[] expected";
                        }
                        if (message.status != null && message.hasOwnProperty("status")) {
                            var error = $root.google.rpc.Status.verify(message.status);
                            if (error)
                                return "status." + error;
                        }
                        if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.commitTimestamp);
                            if (error)
                                return "commitTimestamp." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a BatchWriteResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.BatchWriteResponse} BatchWriteResponse
                     */
                    BatchWriteResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.BatchWriteResponse)
                            return object;
                        var message = new $root.google.spanner.v1.BatchWriteResponse();
                        if (object.indexes) {
                            if (!Array.isArray(object.indexes))
                                throw TypeError(".google.spanner.v1.BatchWriteResponse.indexes: array expected");
                            message.indexes = [];
                            for (var i = 0; i < object.indexes.length; ++i)
                                message.indexes[i] = object.indexes[i] | 0;
                        }
                        if (object.status != null) {
                            if (typeof object.status !== "object")
                                throw TypeError(".google.spanner.v1.BatchWriteResponse.status: object expected");
                            message.status = $root.google.rpc.Status.fromObject(object.status);
                        }
                        if (object.commitTimestamp != null) {
                            if (typeof object.commitTimestamp !== "object")
                                throw TypeError(".google.spanner.v1.BatchWriteResponse.commitTimestamp: object expected");
                            message.commitTimestamp = $root.google.protobuf.Timestamp.fromObject(object.commitTimestamp);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BatchWriteResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {google.spanner.v1.BatchWriteResponse} message BatchWriteResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BatchWriteResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.indexes = [];
                        if (options.defaults) {
                            object.status = null;
                            object.commitTimestamp = null;
                        }
                        if (message.indexes && message.indexes.length) {
                            object.indexes = [];
                            for (var j = 0; j < message.indexes.length; ++j)
                                object.indexes[j] = message.indexes[j];
                        }
                        if (message.status != null && message.hasOwnProperty("status"))
                            object.status = $root.google.rpc.Status.toObject(message.status, options);
                        if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp"))
                            object.commitTimestamp = $root.google.protobuf.Timestamp.toObject(message.commitTimestamp, options);
                        return object;
                    };
    
                    /**
                     * Converts this BatchWriteResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BatchWriteResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BatchWriteResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.BatchWriteResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BatchWriteResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.BatchWriteResponse";
                    };
    
                    return BatchWriteResponse;
                })();
    
                v1.CommitResponse = (function() {
    
                    /**
                     * Properties of a CommitResponse.
                     * @memberof google.spanner.v1
                     * @interface ICommitResponse
                     * @property {google.protobuf.ITimestamp|null} [commitTimestamp] CommitResponse commitTimestamp
                     * @property {google.spanner.v1.CommitResponse.ICommitStats|null} [commitStats] CommitResponse commitStats
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] CommitResponse precommitToken
                     * @property {google.protobuf.ITimestamp|null} [snapshotTimestamp] CommitResponse snapshotTimestamp
                     */
    
                    /**
                     * Constructs a new CommitResponse.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a CommitResponse.
                     * @implements ICommitResponse
                     * @constructor
                     * @param {google.spanner.v1.ICommitResponse=} [properties] Properties to set
                     */
                    function CommitResponse(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CommitResponse commitTimestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} commitTimestamp
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     */
                    CommitResponse.prototype.commitTimestamp = null;
    
                    /**
                     * CommitResponse commitStats.
                     * @member {google.spanner.v1.CommitResponse.ICommitStats|null|undefined} commitStats
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     */
                    CommitResponse.prototype.commitStats = null;
    
                    /**
                     * CommitResponse precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     */
                    CommitResponse.prototype.precommitToken = null;
    
                    /**
                     * CommitResponse snapshotTimestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} snapshotTimestamp
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     */
                    CommitResponse.prototype.snapshotTimestamp = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * CommitResponse MultiplexedSessionRetry.
                     * @member {"precommitToken"|undefined} MultiplexedSessionRetry
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     */
                    Object.defineProperty(CommitResponse.prototype, "MultiplexedSessionRetry", {
                        get: $util.oneOfGetter($oneOfFields = ["precommitToken"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new CommitResponse instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {google.spanner.v1.ICommitResponse=} [properties] Properties to set
                     * @returns {google.spanner.v1.CommitResponse} CommitResponse instance
                     */
                    CommitResponse.create = function create(properties) {
                        return new CommitResponse(properties);
                    };
    
                    /**
                     * Encodes the specified CommitResponse message. Does not implicitly {@link google.spanner.v1.CommitResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {google.spanner.v1.ICommitResponse} message CommitResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CommitResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.commitTimestamp != null && Object.hasOwnProperty.call(message, "commitTimestamp"))
                            $root.google.protobuf.Timestamp.encode(message.commitTimestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.commitStats != null && Object.hasOwnProperty.call(message, "commitStats"))
                            $root.google.spanner.v1.CommitResponse.CommitStats.encode(message.commitStats, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.snapshotTimestamp != null && Object.hasOwnProperty.call(message, "snapshotTimestamp"))
                            $root.google.protobuf.Timestamp.encode(message.snapshotTimestamp, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CommitResponse message, length delimited. Does not implicitly {@link google.spanner.v1.CommitResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {google.spanner.v1.ICommitResponse} message CommitResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CommitResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CommitResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.CommitResponse} CommitResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CommitResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.CommitResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.commitTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.commitStats = $root.google.spanner.v1.CommitResponse.CommitStats.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.snapshotTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CommitResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.CommitResponse} CommitResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CommitResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CommitResponse message.
                     * @function verify
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CommitResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.commitTimestamp);
                            if (error)
                                return "commitTimestamp." + error;
                        }
                        if (message.commitStats != null && message.hasOwnProperty("commitStats")) {
                            var error = $root.google.spanner.v1.CommitResponse.CommitStats.verify(message.commitStats);
                            if (error)
                                return "commitStats." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            properties.MultiplexedSessionRetry = 1;
                            {
                                var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                                if (error)
                                    return "precommitToken." + error;
                            }
                        }
                        if (message.snapshotTimestamp != null && message.hasOwnProperty("snapshotTimestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.snapshotTimestamp);
                            if (error)
                                return "snapshotTimestamp." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CommitResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.CommitResponse} CommitResponse
                     */
                    CommitResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.CommitResponse)
                            return object;
                        var message = new $root.google.spanner.v1.CommitResponse();
                        if (object.commitTimestamp != null) {
                            if (typeof object.commitTimestamp !== "object")
                                throw TypeError(".google.spanner.v1.CommitResponse.commitTimestamp: object expected");
                            message.commitTimestamp = $root.google.protobuf.Timestamp.fromObject(object.commitTimestamp);
                        }
                        if (object.commitStats != null) {
                            if (typeof object.commitStats !== "object")
                                throw TypeError(".google.spanner.v1.CommitResponse.commitStats: object expected");
                            message.commitStats = $root.google.spanner.v1.CommitResponse.CommitStats.fromObject(object.commitStats);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.CommitResponse.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        if (object.snapshotTimestamp != null) {
                            if (typeof object.snapshotTimestamp !== "object")
                                throw TypeError(".google.spanner.v1.CommitResponse.snapshotTimestamp: object expected");
                            message.snapshotTimestamp = $root.google.protobuf.Timestamp.fromObject(object.snapshotTimestamp);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CommitResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {google.spanner.v1.CommitResponse} message CommitResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CommitResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.commitTimestamp = null;
                            object.commitStats = null;
                            object.snapshotTimestamp = null;
                        }
                        if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp"))
                            object.commitTimestamp = $root.google.protobuf.Timestamp.toObject(message.commitTimestamp, options);
                        if (message.commitStats != null && message.hasOwnProperty("commitStats"))
                            object.commitStats = $root.google.spanner.v1.CommitResponse.CommitStats.toObject(message.commitStats, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                            if (options.oneofs)
                                object.MultiplexedSessionRetry = "precommitToken";
                        }
                        if (message.snapshotTimestamp != null && message.hasOwnProperty("snapshotTimestamp"))
                            object.snapshotTimestamp = $root.google.protobuf.Timestamp.toObject(message.snapshotTimestamp, options);
                        return object;
                    };
    
                    /**
                     * Converts this CommitResponse to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.CommitResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CommitResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for CommitResponse
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.CommitResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    CommitResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.CommitResponse";
                    };
    
                    CommitResponse.CommitStats = (function() {
    
                        /**
                         * Properties of a CommitStats.
                         * @memberof google.spanner.v1.CommitResponse
                         * @interface ICommitStats
                         * @property {number|Long|null} [mutationCount] CommitStats mutationCount
                         */
    
                        /**
                         * Constructs a new CommitStats.
                         * @memberof google.spanner.v1.CommitResponse
                         * @classdesc Represents a CommitStats.
                         * @implements ICommitStats
                         * @constructor
                         * @param {google.spanner.v1.CommitResponse.ICommitStats=} [properties] Properties to set
                         */
                        function CommitStats(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * CommitStats mutationCount.
                         * @member {number|Long} mutationCount
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @instance
                         */
                        CommitStats.prototype.mutationCount = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                        /**
                         * Creates a new CommitStats instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {google.spanner.v1.CommitResponse.ICommitStats=} [properties] Properties to set
                         * @returns {google.spanner.v1.CommitResponse.CommitStats} CommitStats instance
                         */
                        CommitStats.create = function create(properties) {
                            return new CommitStats(properties);
                        };
    
                        /**
                         * Encodes the specified CommitStats message. Does not implicitly {@link google.spanner.v1.CommitResponse.CommitStats.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {google.spanner.v1.CommitResponse.ICommitStats} message CommitStats message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CommitStats.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.mutationCount != null && Object.hasOwnProperty.call(message, "mutationCount"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int64(message.mutationCount);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified CommitStats message, length delimited. Does not implicitly {@link google.spanner.v1.CommitResponse.CommitStats.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {google.spanner.v1.CommitResponse.ICommitStats} message CommitStats message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        CommitStats.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a CommitStats message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.CommitResponse.CommitStats} CommitStats
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CommitStats.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.CommitResponse.CommitStats();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.mutationCount = reader.int64();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a CommitStats message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.CommitResponse.CommitStats} CommitStats
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        CommitStats.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a CommitStats message.
                         * @function verify
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        CommitStats.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.mutationCount != null && message.hasOwnProperty("mutationCount"))
                                if (!$util.isInteger(message.mutationCount) && !(message.mutationCount && $util.isInteger(message.mutationCount.low) && $util.isInteger(message.mutationCount.high)))
                                    return "mutationCount: integer|Long expected";
                            return null;
                        };
    
                        /**
                         * Creates a CommitStats message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.CommitResponse.CommitStats} CommitStats
                         */
                        CommitStats.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.CommitResponse.CommitStats)
                                return object;
                            var message = new $root.google.spanner.v1.CommitResponse.CommitStats();
                            if (object.mutationCount != null)
                                if ($util.Long)
                                    (message.mutationCount = $util.Long.fromValue(object.mutationCount)).unsigned = false;
                                else if (typeof object.mutationCount === "string")
                                    message.mutationCount = parseInt(object.mutationCount, 10);
                                else if (typeof object.mutationCount === "number")
                                    message.mutationCount = object.mutationCount;
                                else if (typeof object.mutationCount === "object")
                                    message.mutationCount = new $util.LongBits(object.mutationCount.low >>> 0, object.mutationCount.high >>> 0).toNumber();
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a CommitStats message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {google.spanner.v1.CommitResponse.CommitStats} message CommitStats
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        CommitStats.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                if ($util.Long) {
                                    var long = new $util.Long(0, 0, false);
                                    object.mutationCount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                } else
                                    object.mutationCount = options.longs === String ? "0" : 0;
                            if (message.mutationCount != null && message.hasOwnProperty("mutationCount"))
                                if (typeof message.mutationCount === "number")
                                    object.mutationCount = options.longs === String ? String(message.mutationCount) : message.mutationCount;
                                else
                                    object.mutationCount = options.longs === String ? $util.Long.prototype.toString.call(message.mutationCount) : options.longs === Number ? new $util.LongBits(message.mutationCount.low >>> 0, message.mutationCount.high >>> 0).toNumber() : message.mutationCount;
                            return object;
                        };
    
                        /**
                         * Converts this CommitStats to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        CommitStats.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for CommitStats
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.CommitResponse.CommitStats
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        CommitStats.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.CommitResponse.CommitStats";
                        };
    
                        return CommitStats;
                    })();
    
                    return CommitResponse;
                })();
    
                v1.TransactionOptions = (function() {
    
                    /**
                     * Properties of a TransactionOptions.
                     * @memberof google.spanner.v1
                     * @interface ITransactionOptions
                     * @property {google.spanner.v1.TransactionOptions.IReadWrite|null} [readWrite] TransactionOptions readWrite
                     * @property {google.spanner.v1.TransactionOptions.IPartitionedDml|null} [partitionedDml] TransactionOptions partitionedDml
                     * @property {google.spanner.v1.TransactionOptions.IReadOnly|null} [readOnly] TransactionOptions readOnly
                     * @property {boolean|null} [excludeTxnFromChangeStreams] TransactionOptions excludeTxnFromChangeStreams
                     * @property {google.spanner.v1.TransactionOptions.IsolationLevel|null} [isolationLevel] TransactionOptions isolationLevel
                     */
    
                    /**
                     * Constructs a new TransactionOptions.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a TransactionOptions.
                     * @implements ITransactionOptions
                     * @constructor
                     * @param {google.spanner.v1.ITransactionOptions=} [properties] Properties to set
                     */
                    function TransactionOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TransactionOptions readWrite.
                     * @member {google.spanner.v1.TransactionOptions.IReadWrite|null|undefined} readWrite
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    TransactionOptions.prototype.readWrite = null;
    
                    /**
                     * TransactionOptions partitionedDml.
                     * @member {google.spanner.v1.TransactionOptions.IPartitionedDml|null|undefined} partitionedDml
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    TransactionOptions.prototype.partitionedDml = null;
    
                    /**
                     * TransactionOptions readOnly.
                     * @member {google.spanner.v1.TransactionOptions.IReadOnly|null|undefined} readOnly
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    TransactionOptions.prototype.readOnly = null;
    
                    /**
                     * TransactionOptions excludeTxnFromChangeStreams.
                     * @member {boolean} excludeTxnFromChangeStreams
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    TransactionOptions.prototype.excludeTxnFromChangeStreams = false;
    
                    /**
                     * TransactionOptions isolationLevel.
                     * @member {google.spanner.v1.TransactionOptions.IsolationLevel} isolationLevel
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    TransactionOptions.prototype.isolationLevel = 0;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * TransactionOptions mode.
                     * @member {"readWrite"|"partitionedDml"|"readOnly"|undefined} mode
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     */
                    Object.defineProperty(TransactionOptions.prototype, "mode", {
                        get: $util.oneOfGetter($oneOfFields = ["readWrite", "partitionedDml", "readOnly"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new TransactionOptions instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {google.spanner.v1.ITransactionOptions=} [properties] Properties to set
                     * @returns {google.spanner.v1.TransactionOptions} TransactionOptions instance
                     */
                    TransactionOptions.create = function create(properties) {
                        return new TransactionOptions(properties);
                    };
    
                    /**
                     * Encodes the specified TransactionOptions message. Does not implicitly {@link google.spanner.v1.TransactionOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {google.spanner.v1.ITransactionOptions} message TransactionOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TransactionOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.readWrite != null && Object.hasOwnProperty.call(message, "readWrite"))
                            $root.google.spanner.v1.TransactionOptions.ReadWrite.encode(message.readWrite, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.readOnly != null && Object.hasOwnProperty.call(message, "readOnly"))
                            $root.google.spanner.v1.TransactionOptions.ReadOnly.encode(message.readOnly, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.partitionedDml != null && Object.hasOwnProperty.call(message, "partitionedDml"))
                            $root.google.spanner.v1.TransactionOptions.PartitionedDml.encode(message.partitionedDml, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.excludeTxnFromChangeStreams != null && Object.hasOwnProperty.call(message, "excludeTxnFromChangeStreams"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.excludeTxnFromChangeStreams);
                        if (message.isolationLevel != null && Object.hasOwnProperty.call(message, "isolationLevel"))
                            writer.uint32(/* id 6, wireType 0 =*/48).int32(message.isolationLevel);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TransactionOptions message, length delimited. Does not implicitly {@link google.spanner.v1.TransactionOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {google.spanner.v1.ITransactionOptions} message TransactionOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TransactionOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TransactionOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.TransactionOptions} TransactionOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TransactionOptions.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.TransactionOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.readWrite = $root.google.spanner.v1.TransactionOptions.ReadWrite.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.partitionedDml = $root.google.spanner.v1.TransactionOptions.PartitionedDml.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.readOnly = $root.google.spanner.v1.TransactionOptions.ReadOnly.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.excludeTxnFromChangeStreams = reader.bool();
                                    break;
                                }
                            case 6: {
                                    message.isolationLevel = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TransactionOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.TransactionOptions} TransactionOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TransactionOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TransactionOptions message.
                     * @function verify
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TransactionOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.readWrite != null && message.hasOwnProperty("readWrite")) {
                            properties.mode = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.ReadWrite.verify(message.readWrite);
                                if (error)
                                    return "readWrite." + error;
                            }
                        }
                        if (message.partitionedDml != null && message.hasOwnProperty("partitionedDml")) {
                            if (properties.mode === 1)
                                return "mode: multiple values";
                            properties.mode = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.PartitionedDml.verify(message.partitionedDml);
                                if (error)
                                    return "partitionedDml." + error;
                            }
                        }
                        if (message.readOnly != null && message.hasOwnProperty("readOnly")) {
                            if (properties.mode === 1)
                                return "mode: multiple values";
                            properties.mode = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.ReadOnly.verify(message.readOnly);
                                if (error)
                                    return "readOnly." + error;
                            }
                        }
                        if (message.excludeTxnFromChangeStreams != null && message.hasOwnProperty("excludeTxnFromChangeStreams"))
                            if (typeof message.excludeTxnFromChangeStreams !== "boolean")
                                return "excludeTxnFromChangeStreams: boolean expected";
                        if (message.isolationLevel != null && message.hasOwnProperty("isolationLevel"))
                            switch (message.isolationLevel) {
                            default:
                                return "isolationLevel: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        return null;
                    };
    
                    /**
                     * Creates a TransactionOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.TransactionOptions} TransactionOptions
                     */
                    TransactionOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.TransactionOptions)
                            return object;
                        var message = new $root.google.spanner.v1.TransactionOptions();
                        if (object.readWrite != null) {
                            if (typeof object.readWrite !== "object")
                                throw TypeError(".google.spanner.v1.TransactionOptions.readWrite: object expected");
                            message.readWrite = $root.google.spanner.v1.TransactionOptions.ReadWrite.fromObject(object.readWrite);
                        }
                        if (object.partitionedDml != null) {
                            if (typeof object.partitionedDml !== "object")
                                throw TypeError(".google.spanner.v1.TransactionOptions.partitionedDml: object expected");
                            message.partitionedDml = $root.google.spanner.v1.TransactionOptions.PartitionedDml.fromObject(object.partitionedDml);
                        }
                        if (object.readOnly != null) {
                            if (typeof object.readOnly !== "object")
                                throw TypeError(".google.spanner.v1.TransactionOptions.readOnly: object expected");
                            message.readOnly = $root.google.spanner.v1.TransactionOptions.ReadOnly.fromObject(object.readOnly);
                        }
                        if (object.excludeTxnFromChangeStreams != null)
                            message.excludeTxnFromChangeStreams = Boolean(object.excludeTxnFromChangeStreams);
                        switch (object.isolationLevel) {
                        default:
                            if (typeof object.isolationLevel === "number") {
                                message.isolationLevel = object.isolationLevel;
                                break;
                            }
                            break;
                        case "ISOLATION_LEVEL_UNSPECIFIED":
                        case 0:
                            message.isolationLevel = 0;
                            break;
                        case "SERIALIZABLE":
                        case 1:
                            message.isolationLevel = 1;
                            break;
                        case "REPEATABLE_READ":
                        case 2:
                            message.isolationLevel = 2;
                            break;
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TransactionOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {google.spanner.v1.TransactionOptions} message TransactionOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TransactionOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.excludeTxnFromChangeStreams = false;
                            object.isolationLevel = options.enums === String ? "ISOLATION_LEVEL_UNSPECIFIED" : 0;
                        }
                        if (message.readWrite != null && message.hasOwnProperty("readWrite")) {
                            object.readWrite = $root.google.spanner.v1.TransactionOptions.ReadWrite.toObject(message.readWrite, options);
                            if (options.oneofs)
                                object.mode = "readWrite";
                        }
                        if (message.readOnly != null && message.hasOwnProperty("readOnly")) {
                            object.readOnly = $root.google.spanner.v1.TransactionOptions.ReadOnly.toObject(message.readOnly, options);
                            if (options.oneofs)
                                object.mode = "readOnly";
                        }
                        if (message.partitionedDml != null && message.hasOwnProperty("partitionedDml")) {
                            object.partitionedDml = $root.google.spanner.v1.TransactionOptions.PartitionedDml.toObject(message.partitionedDml, options);
                            if (options.oneofs)
                                object.mode = "partitionedDml";
                        }
                        if (message.excludeTxnFromChangeStreams != null && message.hasOwnProperty("excludeTxnFromChangeStreams"))
                            object.excludeTxnFromChangeStreams = message.excludeTxnFromChangeStreams;
                        if (message.isolationLevel != null && message.hasOwnProperty("isolationLevel"))
                            object.isolationLevel = options.enums === String ? $root.google.spanner.v1.TransactionOptions.IsolationLevel[message.isolationLevel] === undefined ? message.isolationLevel : $root.google.spanner.v1.TransactionOptions.IsolationLevel[message.isolationLevel] : message.isolationLevel;
                        return object;
                    };
    
                    /**
                     * Converts this TransactionOptions to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.TransactionOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TransactionOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for TransactionOptions
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.TransactionOptions
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    TransactionOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.TransactionOptions";
                    };
    
                    TransactionOptions.ReadWrite = (function() {
    
                        /**
                         * Properties of a ReadWrite.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @interface IReadWrite
                         * @property {google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode|null} [readLockMode] ReadWrite readLockMode
                         * @property {Uint8Array|null} [multiplexedSessionPreviousTransactionId] ReadWrite multiplexedSessionPreviousTransactionId
                         */
    
                        /**
                         * Constructs a new ReadWrite.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @classdesc Represents a ReadWrite.
                         * @implements IReadWrite
                         * @constructor
                         * @param {google.spanner.v1.TransactionOptions.IReadWrite=} [properties] Properties to set
                         */
                        function ReadWrite(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ReadWrite readLockMode.
                         * @member {google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode} readLockMode
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @instance
                         */
                        ReadWrite.prototype.readLockMode = 0;
    
                        /**
                         * ReadWrite multiplexedSessionPreviousTransactionId.
                         * @member {Uint8Array} multiplexedSessionPreviousTransactionId
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @instance
                         */
                        ReadWrite.prototype.multiplexedSessionPreviousTransactionId = $util.newBuffer([]);
    
                        /**
                         * Creates a new ReadWrite instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadWrite=} [properties] Properties to set
                         * @returns {google.spanner.v1.TransactionOptions.ReadWrite} ReadWrite instance
                         */
                        ReadWrite.create = function create(properties) {
                            return new ReadWrite(properties);
                        };
    
                        /**
                         * Encodes the specified ReadWrite message. Does not implicitly {@link google.spanner.v1.TransactionOptions.ReadWrite.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadWrite} message ReadWrite message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadWrite.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.readLockMode != null && Object.hasOwnProperty.call(message, "readLockMode"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.readLockMode);
                            if (message.multiplexedSessionPreviousTransactionId != null && Object.hasOwnProperty.call(message, "multiplexedSessionPreviousTransactionId"))
                                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.multiplexedSessionPreviousTransactionId);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ReadWrite message, length delimited. Does not implicitly {@link google.spanner.v1.TransactionOptions.ReadWrite.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadWrite} message ReadWrite message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadWrite.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ReadWrite message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.TransactionOptions.ReadWrite} ReadWrite
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadWrite.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.TransactionOptions.ReadWrite();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.readLockMode = reader.int32();
                                        break;
                                    }
                                case 2: {
                                        message.multiplexedSessionPreviousTransactionId = reader.bytes();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ReadWrite message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.TransactionOptions.ReadWrite} ReadWrite
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadWrite.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ReadWrite message.
                         * @function verify
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ReadWrite.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.readLockMode != null && message.hasOwnProperty("readLockMode"))
                                switch (message.readLockMode) {
                                default:
                                    return "readLockMode: enum value expected";
                                case 0:
                                case 1:
                                case 2:
                                    break;
                                }
                            if (message.multiplexedSessionPreviousTransactionId != null && message.hasOwnProperty("multiplexedSessionPreviousTransactionId"))
                                if (!(message.multiplexedSessionPreviousTransactionId && typeof message.multiplexedSessionPreviousTransactionId.length === "number" || $util.isString(message.multiplexedSessionPreviousTransactionId)))
                                    return "multiplexedSessionPreviousTransactionId: buffer expected";
                            return null;
                        };
    
                        /**
                         * Creates a ReadWrite message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.TransactionOptions.ReadWrite} ReadWrite
                         */
                        ReadWrite.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.TransactionOptions.ReadWrite)
                                return object;
                            var message = new $root.google.spanner.v1.TransactionOptions.ReadWrite();
                            switch (object.readLockMode) {
                            default:
                                if (typeof object.readLockMode === "number") {
                                    message.readLockMode = object.readLockMode;
                                    break;
                                }
                                break;
                            case "READ_LOCK_MODE_UNSPECIFIED":
                            case 0:
                                message.readLockMode = 0;
                                break;
                            case "PESSIMISTIC":
                            case 1:
                                message.readLockMode = 1;
                                break;
                            case "OPTIMISTIC":
                            case 2:
                                message.readLockMode = 2;
                                break;
                            }
                            if (object.multiplexedSessionPreviousTransactionId != null)
                                if (typeof object.multiplexedSessionPreviousTransactionId === "string")
                                    $util.base64.decode(object.multiplexedSessionPreviousTransactionId, message.multiplexedSessionPreviousTransactionId = $util.newBuffer($util.base64.length(object.multiplexedSessionPreviousTransactionId)), 0);
                                else if (object.multiplexedSessionPreviousTransactionId.length >= 0)
                                    message.multiplexedSessionPreviousTransactionId = object.multiplexedSessionPreviousTransactionId;
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ReadWrite message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.ReadWrite} message ReadWrite
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ReadWrite.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.readLockMode = options.enums === String ? "READ_LOCK_MODE_UNSPECIFIED" : 0;
                                if (options.bytes === String)
                                    object.multiplexedSessionPreviousTransactionId = "";
                                else {
                                    object.multiplexedSessionPreviousTransactionId = [];
                                    if (options.bytes !== Array)
                                        object.multiplexedSessionPreviousTransactionId = $util.newBuffer(object.multiplexedSessionPreviousTransactionId);
                                }
                            }
                            if (message.readLockMode != null && message.hasOwnProperty("readLockMode"))
                                object.readLockMode = options.enums === String ? $root.google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode[message.readLockMode] === undefined ? message.readLockMode : $root.google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode[message.readLockMode] : message.readLockMode;
                            if (message.multiplexedSessionPreviousTransactionId != null && message.hasOwnProperty("multiplexedSessionPreviousTransactionId"))
                                object.multiplexedSessionPreviousTransactionId = options.bytes === String ? $util.base64.encode(message.multiplexedSessionPreviousTransactionId, 0, message.multiplexedSessionPreviousTransactionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.multiplexedSessionPreviousTransactionId) : message.multiplexedSessionPreviousTransactionId;
                            return object;
                        };
    
                        /**
                         * Converts this ReadWrite to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ReadWrite.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ReadWrite
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.TransactionOptions.ReadWrite
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ReadWrite.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.TransactionOptions.ReadWrite";
                        };
    
                        /**
                         * ReadLockMode enum.
                         * @name google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode
                         * @enum {number}
                         * @property {number} READ_LOCK_MODE_UNSPECIFIED=0 READ_LOCK_MODE_UNSPECIFIED value
                         * @property {number} PESSIMISTIC=1 PESSIMISTIC value
                         * @property {number} OPTIMISTIC=2 OPTIMISTIC value
                         */
                        ReadWrite.ReadLockMode = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "READ_LOCK_MODE_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "PESSIMISTIC"] = 1;
                            values[valuesById[2] = "OPTIMISTIC"] = 2;
                            return values;
                        })();
    
                        return ReadWrite;
                    })();
    
                    TransactionOptions.PartitionedDml = (function() {
    
                        /**
                         * Properties of a PartitionedDml.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @interface IPartitionedDml
                         */
    
                        /**
                         * Constructs a new PartitionedDml.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @classdesc Represents a PartitionedDml.
                         * @implements IPartitionedDml
                         * @constructor
                         * @param {google.spanner.v1.TransactionOptions.IPartitionedDml=} [properties] Properties to set
                         */
                        function PartitionedDml(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Creates a new PartitionedDml instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IPartitionedDml=} [properties] Properties to set
                         * @returns {google.spanner.v1.TransactionOptions.PartitionedDml} PartitionedDml instance
                         */
                        PartitionedDml.create = function create(properties) {
                            return new PartitionedDml(properties);
                        };
    
                        /**
                         * Encodes the specified PartitionedDml message. Does not implicitly {@link google.spanner.v1.TransactionOptions.PartitionedDml.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IPartitionedDml} message PartitionedDml message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionedDml.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified PartitionedDml message, length delimited. Does not implicitly {@link google.spanner.v1.TransactionOptions.PartitionedDml.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IPartitionedDml} message PartitionedDml message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionedDml.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a PartitionedDml message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.TransactionOptions.PartitionedDml} PartitionedDml
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionedDml.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.TransactionOptions.PartitionedDml();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a PartitionedDml message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.TransactionOptions.PartitionedDml} PartitionedDml
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionedDml.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a PartitionedDml message.
                         * @function verify
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        PartitionedDml.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            return null;
                        };
    
                        /**
                         * Creates a PartitionedDml message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.TransactionOptions.PartitionedDml} PartitionedDml
                         */
                        PartitionedDml.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.TransactionOptions.PartitionedDml)
                                return object;
                            return new $root.google.spanner.v1.TransactionOptions.PartitionedDml();
                        };
    
                        /**
                         * Creates a plain object from a PartitionedDml message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.PartitionedDml} message PartitionedDml
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        PartitionedDml.toObject = function toObject() {
                            return {};
                        };
    
                        /**
                         * Converts this PartitionedDml to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        PartitionedDml.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for PartitionedDml
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.TransactionOptions.PartitionedDml
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        PartitionedDml.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.TransactionOptions.PartitionedDml";
                        };
    
                        return PartitionedDml;
                    })();
    
                    TransactionOptions.ReadOnly = (function() {
    
                        /**
                         * Properties of a ReadOnly.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @interface IReadOnly
                         * @property {boolean|null} [strong] ReadOnly strong
                         * @property {google.protobuf.ITimestamp|null} [minReadTimestamp] ReadOnly minReadTimestamp
                         * @property {google.protobuf.IDuration|null} [maxStaleness] ReadOnly maxStaleness
                         * @property {google.protobuf.ITimestamp|null} [readTimestamp] ReadOnly readTimestamp
                         * @property {google.protobuf.IDuration|null} [exactStaleness] ReadOnly exactStaleness
                         * @property {boolean|null} [returnReadTimestamp] ReadOnly returnReadTimestamp
                         */
    
                        /**
                         * Constructs a new ReadOnly.
                         * @memberof google.spanner.v1.TransactionOptions
                         * @classdesc Represents a ReadOnly.
                         * @implements IReadOnly
                         * @constructor
                         * @param {google.spanner.v1.TransactionOptions.IReadOnly=} [properties] Properties to set
                         */
                        function ReadOnly(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ReadOnly strong.
                         * @member {boolean|null|undefined} strong
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.strong = null;
    
                        /**
                         * ReadOnly minReadTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} minReadTimestamp
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.minReadTimestamp = null;
    
                        /**
                         * ReadOnly maxStaleness.
                         * @member {google.protobuf.IDuration|null|undefined} maxStaleness
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.maxStaleness = null;
    
                        /**
                         * ReadOnly readTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} readTimestamp
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.readTimestamp = null;
    
                        /**
                         * ReadOnly exactStaleness.
                         * @member {google.protobuf.IDuration|null|undefined} exactStaleness
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.exactStaleness = null;
    
                        /**
                         * ReadOnly returnReadTimestamp.
                         * @member {boolean} returnReadTimestamp
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        ReadOnly.prototype.returnReadTimestamp = false;
    
                        // OneOf field names bound to virtual getters and setters
                        var $oneOfFields;
    
                        /**
                         * ReadOnly timestampBound.
                         * @member {"strong"|"minReadTimestamp"|"maxStaleness"|"readTimestamp"|"exactStaleness"|undefined} timestampBound
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         */
                        Object.defineProperty(ReadOnly.prototype, "timestampBound", {
                            get: $util.oneOfGetter($oneOfFields = ["strong", "minReadTimestamp", "maxStaleness", "readTimestamp", "exactStaleness"]),
                            set: $util.oneOfSetter($oneOfFields)
                        });
    
                        /**
                         * Creates a new ReadOnly instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadOnly=} [properties] Properties to set
                         * @returns {google.spanner.v1.TransactionOptions.ReadOnly} ReadOnly instance
                         */
                        ReadOnly.create = function create(properties) {
                            return new ReadOnly(properties);
                        };
    
                        /**
                         * Encodes the specified ReadOnly message. Does not implicitly {@link google.spanner.v1.TransactionOptions.ReadOnly.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadOnly} message ReadOnly message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadOnly.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.strong != null && Object.hasOwnProperty.call(message, "strong"))
                                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.strong);
                            if (message.minReadTimestamp != null && Object.hasOwnProperty.call(message, "minReadTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.minReadTimestamp, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            if (message.maxStaleness != null && Object.hasOwnProperty.call(message, "maxStaleness"))
                                $root.google.protobuf.Duration.encode(message.maxStaleness, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            if (message.readTimestamp != null && Object.hasOwnProperty.call(message, "readTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.readTimestamp, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.exactStaleness != null && Object.hasOwnProperty.call(message, "exactStaleness"))
                                $root.google.protobuf.Duration.encode(message.exactStaleness, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            if (message.returnReadTimestamp != null && Object.hasOwnProperty.call(message, "returnReadTimestamp"))
                                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.returnReadTimestamp);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ReadOnly message, length delimited. Does not implicitly {@link google.spanner.v1.TransactionOptions.ReadOnly.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.IReadOnly} message ReadOnly message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ReadOnly.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ReadOnly message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.TransactionOptions.ReadOnly} ReadOnly
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadOnly.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.TransactionOptions.ReadOnly();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.strong = reader.bool();
                                        break;
                                    }
                                case 2: {
                                        message.minReadTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 3: {
                                        message.maxStaleness = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 4: {
                                        message.readTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 5: {
                                        message.exactStaleness = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 6: {
                                        message.returnReadTimestamp = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ReadOnly message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.TransactionOptions.ReadOnly} ReadOnly
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ReadOnly.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ReadOnly message.
                         * @function verify
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ReadOnly.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            var properties = {};
                            if (message.strong != null && message.hasOwnProperty("strong")) {
                                properties.timestampBound = 1;
                                if (typeof message.strong !== "boolean")
                                    return "strong: boolean expected";
                            }
                            if (message.minReadTimestamp != null && message.hasOwnProperty("minReadTimestamp")) {
                                if (properties.timestampBound === 1)
                                    return "timestampBound: multiple values";
                                properties.timestampBound = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.minReadTimestamp);
                                    if (error)
                                        return "minReadTimestamp." + error;
                                }
                            }
                            if (message.maxStaleness != null && message.hasOwnProperty("maxStaleness")) {
                                if (properties.timestampBound === 1)
                                    return "timestampBound: multiple values";
                                properties.timestampBound = 1;
                                {
                                    var error = $root.google.protobuf.Duration.verify(message.maxStaleness);
                                    if (error)
                                        return "maxStaleness." + error;
                                }
                            }
                            if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp")) {
                                if (properties.timestampBound === 1)
                                    return "timestampBound: multiple values";
                                properties.timestampBound = 1;
                                {
                                    var error = $root.google.protobuf.Timestamp.verify(message.readTimestamp);
                                    if (error)
                                        return "readTimestamp." + error;
                                }
                            }
                            if (message.exactStaleness != null && message.hasOwnProperty("exactStaleness")) {
                                if (properties.timestampBound === 1)
                                    return "timestampBound: multiple values";
                                properties.timestampBound = 1;
                                {
                                    var error = $root.google.protobuf.Duration.verify(message.exactStaleness);
                                    if (error)
                                        return "exactStaleness." + error;
                                }
                            }
                            if (message.returnReadTimestamp != null && message.hasOwnProperty("returnReadTimestamp"))
                                if (typeof message.returnReadTimestamp !== "boolean")
                                    return "returnReadTimestamp: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a ReadOnly message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.TransactionOptions.ReadOnly} ReadOnly
                         */
                        ReadOnly.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.TransactionOptions.ReadOnly)
                                return object;
                            var message = new $root.google.spanner.v1.TransactionOptions.ReadOnly();
                            if (object.strong != null)
                                message.strong = Boolean(object.strong);
                            if (object.minReadTimestamp != null) {
                                if (typeof object.minReadTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.TransactionOptions.ReadOnly.minReadTimestamp: object expected");
                                message.minReadTimestamp = $root.google.protobuf.Timestamp.fromObject(object.minReadTimestamp);
                            }
                            if (object.maxStaleness != null) {
                                if (typeof object.maxStaleness !== "object")
                                    throw TypeError(".google.spanner.v1.TransactionOptions.ReadOnly.maxStaleness: object expected");
                                message.maxStaleness = $root.google.protobuf.Duration.fromObject(object.maxStaleness);
                            }
                            if (object.readTimestamp != null) {
                                if (typeof object.readTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.TransactionOptions.ReadOnly.readTimestamp: object expected");
                                message.readTimestamp = $root.google.protobuf.Timestamp.fromObject(object.readTimestamp);
                            }
                            if (object.exactStaleness != null) {
                                if (typeof object.exactStaleness !== "object")
                                    throw TypeError(".google.spanner.v1.TransactionOptions.ReadOnly.exactStaleness: object expected");
                                message.exactStaleness = $root.google.protobuf.Duration.fromObject(object.exactStaleness);
                            }
                            if (object.returnReadTimestamp != null)
                                message.returnReadTimestamp = Boolean(object.returnReadTimestamp);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ReadOnly message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {google.spanner.v1.TransactionOptions.ReadOnly} message ReadOnly
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ReadOnly.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.returnReadTimestamp = false;
                            if (message.strong != null && message.hasOwnProperty("strong")) {
                                object.strong = message.strong;
                                if (options.oneofs)
                                    object.timestampBound = "strong";
                            }
                            if (message.minReadTimestamp != null && message.hasOwnProperty("minReadTimestamp")) {
                                object.minReadTimestamp = $root.google.protobuf.Timestamp.toObject(message.minReadTimestamp, options);
                                if (options.oneofs)
                                    object.timestampBound = "minReadTimestamp";
                            }
                            if (message.maxStaleness != null && message.hasOwnProperty("maxStaleness")) {
                                object.maxStaleness = $root.google.protobuf.Duration.toObject(message.maxStaleness, options);
                                if (options.oneofs)
                                    object.timestampBound = "maxStaleness";
                            }
                            if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp")) {
                                object.readTimestamp = $root.google.protobuf.Timestamp.toObject(message.readTimestamp, options);
                                if (options.oneofs)
                                    object.timestampBound = "readTimestamp";
                            }
                            if (message.exactStaleness != null && message.hasOwnProperty("exactStaleness")) {
                                object.exactStaleness = $root.google.protobuf.Duration.toObject(message.exactStaleness, options);
                                if (options.oneofs)
                                    object.timestampBound = "exactStaleness";
                            }
                            if (message.returnReadTimestamp != null && message.hasOwnProperty("returnReadTimestamp"))
                                object.returnReadTimestamp = message.returnReadTimestamp;
                            return object;
                        };
    
                        /**
                         * Converts this ReadOnly to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ReadOnly.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ReadOnly
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.TransactionOptions.ReadOnly
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ReadOnly.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.TransactionOptions.ReadOnly";
                        };
    
                        return ReadOnly;
                    })();
    
                    /**
                     * IsolationLevel enum.
                     * @name google.spanner.v1.TransactionOptions.IsolationLevel
                     * @enum {number}
                     * @property {number} ISOLATION_LEVEL_UNSPECIFIED=0 ISOLATION_LEVEL_UNSPECIFIED value
                     * @property {number} SERIALIZABLE=1 SERIALIZABLE value
                     * @property {number} REPEATABLE_READ=2 REPEATABLE_READ value
                     */
                    TransactionOptions.IsolationLevel = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "ISOLATION_LEVEL_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "SERIALIZABLE"] = 1;
                        values[valuesById[2] = "REPEATABLE_READ"] = 2;
                        return values;
                    })();
    
                    return TransactionOptions;
                })();
    
                v1.Transaction = (function() {
    
                    /**
                     * Properties of a Transaction.
                     * @memberof google.spanner.v1
                     * @interface ITransaction
                     * @property {Uint8Array|null} [id] Transaction id
                     * @property {google.protobuf.ITimestamp|null} [readTimestamp] Transaction readTimestamp
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] Transaction precommitToken
                     */
    
                    /**
                     * Constructs a new Transaction.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Transaction.
                     * @implements ITransaction
                     * @constructor
                     * @param {google.spanner.v1.ITransaction=} [properties] Properties to set
                     */
                    function Transaction(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Transaction id.
                     * @member {Uint8Array} id
                     * @memberof google.spanner.v1.Transaction
                     * @instance
                     */
                    Transaction.prototype.id = $util.newBuffer([]);
    
                    /**
                     * Transaction readTimestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} readTimestamp
                     * @memberof google.spanner.v1.Transaction
                     * @instance
                     */
                    Transaction.prototype.readTimestamp = null;
    
                    /**
                     * Transaction precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.Transaction
                     * @instance
                     */
                    Transaction.prototype.precommitToken = null;
    
                    /**
                     * Creates a new Transaction instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {google.spanner.v1.ITransaction=} [properties] Properties to set
                     * @returns {google.spanner.v1.Transaction} Transaction instance
                     */
                    Transaction.create = function create(properties) {
                        return new Transaction(properties);
                    };
    
                    /**
                     * Encodes the specified Transaction message. Does not implicitly {@link google.spanner.v1.Transaction.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {google.spanner.v1.ITransaction} message Transaction message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Transaction.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                            writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id);
                        if (message.readTimestamp != null && Object.hasOwnProperty.call(message, "readTimestamp"))
                            $root.google.protobuf.Timestamp.encode(message.readTimestamp, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Transaction message, length delimited. Does not implicitly {@link google.spanner.v1.Transaction.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {google.spanner.v1.ITransaction} message Transaction message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Transaction.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Transaction message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.Transaction} Transaction
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Transaction.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Transaction();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.id = reader.bytes();
                                    break;
                                }
                            case 2: {
                                    message.readTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Transaction message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.Transaction} Transaction
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Transaction.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Transaction message.
                     * @function verify
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Transaction.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.id != null && message.hasOwnProperty("id"))
                            if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id)))
                                return "id: buffer expected";
                        if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.readTimestamp);
                            if (error)
                                return "readTimestamp." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                            if (error)
                                return "precommitToken." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Transaction message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.Transaction} Transaction
                     */
                    Transaction.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.Transaction)
                            return object;
                        var message = new $root.google.spanner.v1.Transaction();
                        if (object.id != null)
                            if (typeof object.id === "string")
                                $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0);
                            else if (object.id.length >= 0)
                                message.id = object.id;
                        if (object.readTimestamp != null) {
                            if (typeof object.readTimestamp !== "object")
                                throw TypeError(".google.spanner.v1.Transaction.readTimestamp: object expected");
                            message.readTimestamp = $root.google.protobuf.Timestamp.fromObject(object.readTimestamp);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.Transaction.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Transaction message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {google.spanner.v1.Transaction} message Transaction
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Transaction.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            if (options.bytes === String)
                                object.id = "";
                            else {
                                object.id = [];
                                if (options.bytes !== Array)
                                    object.id = $util.newBuffer(object.id);
                            }
                            object.readTimestamp = null;
                            object.precommitToken = null;
                        }
                        if (message.id != null && message.hasOwnProperty("id"))
                            object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id;
                        if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp"))
                            object.readTimestamp = $root.google.protobuf.Timestamp.toObject(message.readTimestamp, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                        return object;
                    };
    
                    /**
                     * Converts this Transaction to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.Transaction
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Transaction.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Transaction
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.Transaction
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Transaction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.Transaction";
                    };
    
                    return Transaction;
                })();
    
                v1.TransactionSelector = (function() {
    
                    /**
                     * Properties of a TransactionSelector.
                     * @memberof google.spanner.v1
                     * @interface ITransactionSelector
                     * @property {google.spanner.v1.ITransactionOptions|null} [singleUse] TransactionSelector singleUse
                     * @property {Uint8Array|null} [id] TransactionSelector id
                     * @property {google.spanner.v1.ITransactionOptions|null} [begin] TransactionSelector begin
                     */
    
                    /**
                     * Constructs a new TransactionSelector.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a TransactionSelector.
                     * @implements ITransactionSelector
                     * @constructor
                     * @param {google.spanner.v1.ITransactionSelector=} [properties] Properties to set
                     */
                    function TransactionSelector(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TransactionSelector singleUse.
                     * @member {google.spanner.v1.ITransactionOptions|null|undefined} singleUse
                     * @memberof google.spanner.v1.TransactionSelector
                     * @instance
                     */
                    TransactionSelector.prototype.singleUse = null;
    
                    /**
                     * TransactionSelector id.
                     * @member {Uint8Array|null|undefined} id
                     * @memberof google.spanner.v1.TransactionSelector
                     * @instance
                     */
                    TransactionSelector.prototype.id = null;
    
                    /**
                     * TransactionSelector begin.
                     * @member {google.spanner.v1.ITransactionOptions|null|undefined} begin
                     * @memberof google.spanner.v1.TransactionSelector
                     * @instance
                     */
                    TransactionSelector.prototype.begin = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * TransactionSelector selector.
                     * @member {"singleUse"|"id"|"begin"|undefined} selector
                     * @memberof google.spanner.v1.TransactionSelector
                     * @instance
                     */
                    Object.defineProperty(TransactionSelector.prototype, "selector", {
                        get: $util.oneOfGetter($oneOfFields = ["singleUse", "id", "begin"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new TransactionSelector instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {google.spanner.v1.ITransactionSelector=} [properties] Properties to set
                     * @returns {google.spanner.v1.TransactionSelector} TransactionSelector instance
                     */
                    TransactionSelector.create = function create(properties) {
                        return new TransactionSelector(properties);
                    };
    
                    /**
                     * Encodes the specified TransactionSelector message. Does not implicitly {@link google.spanner.v1.TransactionSelector.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {google.spanner.v1.ITransactionSelector} message TransactionSelector message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TransactionSelector.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.singleUse != null && Object.hasOwnProperty.call(message, "singleUse"))
                            $root.google.spanner.v1.TransactionOptions.encode(message.singleUse, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.id);
                        if (message.begin != null && Object.hasOwnProperty.call(message, "begin"))
                            $root.google.spanner.v1.TransactionOptions.encode(message.begin, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TransactionSelector message, length delimited. Does not implicitly {@link google.spanner.v1.TransactionSelector.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {google.spanner.v1.ITransactionSelector} message TransactionSelector message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TransactionSelector.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TransactionSelector message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.TransactionSelector} TransactionSelector
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TransactionSelector.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.TransactionSelector();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.singleUse = $root.google.spanner.v1.TransactionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.id = reader.bytes();
                                    break;
                                }
                            case 3: {
                                    message.begin = $root.google.spanner.v1.TransactionOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TransactionSelector message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.TransactionSelector} TransactionSelector
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TransactionSelector.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TransactionSelector message.
                     * @function verify
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TransactionSelector.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.singleUse != null && message.hasOwnProperty("singleUse")) {
                            properties.selector = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.verify(message.singleUse);
                                if (error)
                                    return "singleUse." + error;
                            }
                        }
                        if (message.id != null && message.hasOwnProperty("id")) {
                            if (properties.selector === 1)
                                return "selector: multiple values";
                            properties.selector = 1;
                            if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id)))
                                return "id: buffer expected";
                        }
                        if (message.begin != null && message.hasOwnProperty("begin")) {
                            if (properties.selector === 1)
                                return "selector: multiple values";
                            properties.selector = 1;
                            {
                                var error = $root.google.spanner.v1.TransactionOptions.verify(message.begin);
                                if (error)
                                    return "begin." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a TransactionSelector message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.TransactionSelector} TransactionSelector
                     */
                    TransactionSelector.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.TransactionSelector)
                            return object;
                        var message = new $root.google.spanner.v1.TransactionSelector();
                        if (object.singleUse != null) {
                            if (typeof object.singleUse !== "object")
                                throw TypeError(".google.spanner.v1.TransactionSelector.singleUse: object expected");
                            message.singleUse = $root.google.spanner.v1.TransactionOptions.fromObject(object.singleUse);
                        }
                        if (object.id != null)
                            if (typeof object.id === "string")
                                $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0);
                            else if (object.id.length >= 0)
                                message.id = object.id;
                        if (object.begin != null) {
                            if (typeof object.begin !== "object")
                                throw TypeError(".google.spanner.v1.TransactionSelector.begin: object expected");
                            message.begin = $root.google.spanner.v1.TransactionOptions.fromObject(object.begin);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TransactionSelector message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {google.spanner.v1.TransactionSelector} message TransactionSelector
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TransactionSelector.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.singleUse != null && message.hasOwnProperty("singleUse")) {
                            object.singleUse = $root.google.spanner.v1.TransactionOptions.toObject(message.singleUse, options);
                            if (options.oneofs)
                                object.selector = "singleUse";
                        }
                        if (message.id != null && message.hasOwnProperty("id")) {
                            object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id;
                            if (options.oneofs)
                                object.selector = "id";
                        }
                        if (message.begin != null && message.hasOwnProperty("begin")) {
                            object.begin = $root.google.spanner.v1.TransactionOptions.toObject(message.begin, options);
                            if (options.oneofs)
                                object.selector = "begin";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this TransactionSelector to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.TransactionSelector
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TransactionSelector.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for TransactionSelector
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.TransactionSelector
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    TransactionSelector.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.TransactionSelector";
                    };
    
                    return TransactionSelector;
                })();
    
                v1.MultiplexedSessionPrecommitToken = (function() {
    
                    /**
                     * Properties of a MultiplexedSessionPrecommitToken.
                     * @memberof google.spanner.v1
                     * @interface IMultiplexedSessionPrecommitToken
                     * @property {Uint8Array|null} [precommitToken] MultiplexedSessionPrecommitToken precommitToken
                     * @property {number|null} [seqNum] MultiplexedSessionPrecommitToken seqNum
                     */
    
                    /**
                     * Constructs a new MultiplexedSessionPrecommitToken.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a MultiplexedSessionPrecommitToken.
                     * @implements IMultiplexedSessionPrecommitToken
                     * @constructor
                     * @param {google.spanner.v1.IMultiplexedSessionPrecommitToken=} [properties] Properties to set
                     */
                    function MultiplexedSessionPrecommitToken(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * MultiplexedSessionPrecommitToken precommitToken.
                     * @member {Uint8Array} precommitToken
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @instance
                     */
                    MultiplexedSessionPrecommitToken.prototype.precommitToken = $util.newBuffer([]);
    
                    /**
                     * MultiplexedSessionPrecommitToken seqNum.
                     * @member {number} seqNum
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @instance
                     */
                    MultiplexedSessionPrecommitToken.prototype.seqNum = 0;
    
                    /**
                     * Creates a new MultiplexedSessionPrecommitToken instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {google.spanner.v1.IMultiplexedSessionPrecommitToken=} [properties] Properties to set
                     * @returns {google.spanner.v1.MultiplexedSessionPrecommitToken} MultiplexedSessionPrecommitToken instance
                     */
                    MultiplexedSessionPrecommitToken.create = function create(properties) {
                        return new MultiplexedSessionPrecommitToken(properties);
                    };
    
                    /**
                     * Encodes the specified MultiplexedSessionPrecommitToken message. Does not implicitly {@link google.spanner.v1.MultiplexedSessionPrecommitToken.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {google.spanner.v1.IMultiplexedSessionPrecommitToken} message MultiplexedSessionPrecommitToken message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    MultiplexedSessionPrecommitToken.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.precommitToken);
                        if (message.seqNum != null && Object.hasOwnProperty.call(message, "seqNum"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.seqNum);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified MultiplexedSessionPrecommitToken message, length delimited. Does not implicitly {@link google.spanner.v1.MultiplexedSessionPrecommitToken.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {google.spanner.v1.IMultiplexedSessionPrecommitToken} message MultiplexedSessionPrecommitToken message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    MultiplexedSessionPrecommitToken.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a MultiplexedSessionPrecommitToken message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.MultiplexedSessionPrecommitToken} MultiplexedSessionPrecommitToken
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    MultiplexedSessionPrecommitToken.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.MultiplexedSessionPrecommitToken();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.precommitToken = reader.bytes();
                                    break;
                                }
                            case 2: {
                                    message.seqNum = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a MultiplexedSessionPrecommitToken message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.MultiplexedSessionPrecommitToken} MultiplexedSessionPrecommitToken
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    MultiplexedSessionPrecommitToken.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a MultiplexedSessionPrecommitToken message.
                     * @function verify
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    MultiplexedSessionPrecommitToken.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            if (!(message.precommitToken && typeof message.precommitToken.length === "number" || $util.isString(message.precommitToken)))
                                return "precommitToken: buffer expected";
                        if (message.seqNum != null && message.hasOwnProperty("seqNum"))
                            if (!$util.isInteger(message.seqNum))
                                return "seqNum: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a MultiplexedSessionPrecommitToken message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.MultiplexedSessionPrecommitToken} MultiplexedSessionPrecommitToken
                     */
                    MultiplexedSessionPrecommitToken.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.MultiplexedSessionPrecommitToken)
                            return object;
                        var message = new $root.google.spanner.v1.MultiplexedSessionPrecommitToken();
                        if (object.precommitToken != null)
                            if (typeof object.precommitToken === "string")
                                $util.base64.decode(object.precommitToken, message.precommitToken = $util.newBuffer($util.base64.length(object.precommitToken)), 0);
                            else if (object.precommitToken.length >= 0)
                                message.precommitToken = object.precommitToken;
                        if (object.seqNum != null)
                            message.seqNum = object.seqNum | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a MultiplexedSessionPrecommitToken message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {google.spanner.v1.MultiplexedSessionPrecommitToken} message MultiplexedSessionPrecommitToken
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    MultiplexedSessionPrecommitToken.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            if (options.bytes === String)
                                object.precommitToken = "";
                            else {
                                object.precommitToken = [];
                                if (options.bytes !== Array)
                                    object.precommitToken = $util.newBuffer(object.precommitToken);
                            }
                            object.seqNum = 0;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = options.bytes === String ? $util.base64.encode(message.precommitToken, 0, message.precommitToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.precommitToken) : message.precommitToken;
                        if (message.seqNum != null && message.hasOwnProperty("seqNum"))
                            object.seqNum = message.seqNum;
                        return object;
                    };
    
                    /**
                     * Converts this MultiplexedSessionPrecommitToken to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    MultiplexedSessionPrecommitToken.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for MultiplexedSessionPrecommitToken
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.MultiplexedSessionPrecommitToken
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    MultiplexedSessionPrecommitToken.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.MultiplexedSessionPrecommitToken";
                    };
    
                    return MultiplexedSessionPrecommitToken;
                })();
    
                v1.KeyRange = (function() {
    
                    /**
                     * Properties of a KeyRange.
                     * @memberof google.spanner.v1
                     * @interface IKeyRange
                     * @property {google.protobuf.IListValue|null} [startClosed] KeyRange startClosed
                     * @property {google.protobuf.IListValue|null} [startOpen] KeyRange startOpen
                     * @property {google.protobuf.IListValue|null} [endClosed] KeyRange endClosed
                     * @property {google.protobuf.IListValue|null} [endOpen] KeyRange endOpen
                     */
    
                    /**
                     * Constructs a new KeyRange.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a KeyRange.
                     * @implements IKeyRange
                     * @constructor
                     * @param {google.spanner.v1.IKeyRange=} [properties] Properties to set
                     */
                    function KeyRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * KeyRange startClosed.
                     * @member {google.protobuf.IListValue|null|undefined} startClosed
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    KeyRange.prototype.startClosed = null;
    
                    /**
                     * KeyRange startOpen.
                     * @member {google.protobuf.IListValue|null|undefined} startOpen
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    KeyRange.prototype.startOpen = null;
    
                    /**
                     * KeyRange endClosed.
                     * @member {google.protobuf.IListValue|null|undefined} endClosed
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    KeyRange.prototype.endClosed = null;
    
                    /**
                     * KeyRange endOpen.
                     * @member {google.protobuf.IListValue|null|undefined} endOpen
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    KeyRange.prototype.endOpen = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * KeyRange startKeyType.
                     * @member {"startClosed"|"startOpen"|undefined} startKeyType
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    Object.defineProperty(KeyRange.prototype, "startKeyType", {
                        get: $util.oneOfGetter($oneOfFields = ["startClosed", "startOpen"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * KeyRange endKeyType.
                     * @member {"endClosed"|"endOpen"|undefined} endKeyType
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     */
                    Object.defineProperty(KeyRange.prototype, "endKeyType", {
                        get: $util.oneOfGetter($oneOfFields = ["endClosed", "endOpen"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new KeyRange instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {google.spanner.v1.IKeyRange=} [properties] Properties to set
                     * @returns {google.spanner.v1.KeyRange} KeyRange instance
                     */
                    KeyRange.create = function create(properties) {
                        return new KeyRange(properties);
                    };
    
                    /**
                     * Encodes the specified KeyRange message. Does not implicitly {@link google.spanner.v1.KeyRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {google.spanner.v1.IKeyRange} message KeyRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    KeyRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.startClosed != null && Object.hasOwnProperty.call(message, "startClosed"))
                            $root.google.protobuf.ListValue.encode(message.startClosed, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.startOpen != null && Object.hasOwnProperty.call(message, "startOpen"))
                            $root.google.protobuf.ListValue.encode(message.startOpen, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.endClosed != null && Object.hasOwnProperty.call(message, "endClosed"))
                            $root.google.protobuf.ListValue.encode(message.endClosed, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.endOpen != null && Object.hasOwnProperty.call(message, "endOpen"))
                            $root.google.protobuf.ListValue.encode(message.endOpen, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified KeyRange message, length delimited. Does not implicitly {@link google.spanner.v1.KeyRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {google.spanner.v1.IKeyRange} message KeyRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    KeyRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a KeyRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.KeyRange} KeyRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    KeyRange.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.KeyRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.startClosed = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.startOpen = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.endClosed = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.endOpen = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a KeyRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.KeyRange} KeyRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    KeyRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a KeyRange message.
                     * @function verify
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    KeyRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.startClosed != null && message.hasOwnProperty("startClosed")) {
                            properties.startKeyType = 1;
                            {
                                var error = $root.google.protobuf.ListValue.verify(message.startClosed);
                                if (error)
                                    return "startClosed." + error;
                            }
                        }
                        if (message.startOpen != null && message.hasOwnProperty("startOpen")) {
                            if (properties.startKeyType === 1)
                                return "startKeyType: multiple values";
                            properties.startKeyType = 1;
                            {
                                var error = $root.google.protobuf.ListValue.verify(message.startOpen);
                                if (error)
                                    return "startOpen." + error;
                            }
                        }
                        if (message.endClosed != null && message.hasOwnProperty("endClosed")) {
                            properties.endKeyType = 1;
                            {
                                var error = $root.google.protobuf.ListValue.verify(message.endClosed);
                                if (error)
                                    return "endClosed." + error;
                            }
                        }
                        if (message.endOpen != null && message.hasOwnProperty("endOpen")) {
                            if (properties.endKeyType === 1)
                                return "endKeyType: multiple values";
                            properties.endKeyType = 1;
                            {
                                var error = $root.google.protobuf.ListValue.verify(message.endOpen);
                                if (error)
                                    return "endOpen." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a KeyRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.KeyRange} KeyRange
                     */
                    KeyRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.KeyRange)
                            return object;
                        var message = new $root.google.spanner.v1.KeyRange();
                        if (object.startClosed != null) {
                            if (typeof object.startClosed !== "object")
                                throw TypeError(".google.spanner.v1.KeyRange.startClosed: object expected");
                            message.startClosed = $root.google.protobuf.ListValue.fromObject(object.startClosed);
                        }
                        if (object.startOpen != null) {
                            if (typeof object.startOpen !== "object")
                                throw TypeError(".google.spanner.v1.KeyRange.startOpen: object expected");
                            message.startOpen = $root.google.protobuf.ListValue.fromObject(object.startOpen);
                        }
                        if (object.endClosed != null) {
                            if (typeof object.endClosed !== "object")
                                throw TypeError(".google.spanner.v1.KeyRange.endClosed: object expected");
                            message.endClosed = $root.google.protobuf.ListValue.fromObject(object.endClosed);
                        }
                        if (object.endOpen != null) {
                            if (typeof object.endOpen !== "object")
                                throw TypeError(".google.spanner.v1.KeyRange.endOpen: object expected");
                            message.endOpen = $root.google.protobuf.ListValue.fromObject(object.endOpen);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a KeyRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {google.spanner.v1.KeyRange} message KeyRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    KeyRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.startClosed != null && message.hasOwnProperty("startClosed")) {
                            object.startClosed = $root.google.protobuf.ListValue.toObject(message.startClosed, options);
                            if (options.oneofs)
                                object.startKeyType = "startClosed";
                        }
                        if (message.startOpen != null && message.hasOwnProperty("startOpen")) {
                            object.startOpen = $root.google.protobuf.ListValue.toObject(message.startOpen, options);
                            if (options.oneofs)
                                object.startKeyType = "startOpen";
                        }
                        if (message.endClosed != null && message.hasOwnProperty("endClosed")) {
                            object.endClosed = $root.google.protobuf.ListValue.toObject(message.endClosed, options);
                            if (options.oneofs)
                                object.endKeyType = "endClosed";
                        }
                        if (message.endOpen != null && message.hasOwnProperty("endOpen")) {
                            object.endOpen = $root.google.protobuf.ListValue.toObject(message.endOpen, options);
                            if (options.oneofs)
                                object.endKeyType = "endOpen";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this KeyRange to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.KeyRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    KeyRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for KeyRange
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.KeyRange
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    KeyRange.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.KeyRange";
                    };
    
                    return KeyRange;
                })();
    
                v1.KeySet = (function() {
    
                    /**
                     * Properties of a KeySet.
                     * @memberof google.spanner.v1
                     * @interface IKeySet
                     * @property {Array.<google.protobuf.IListValue>|null} [keys] KeySet keys
                     * @property {Array.<google.spanner.v1.IKeyRange>|null} [ranges] KeySet ranges
                     * @property {boolean|null} [all] KeySet all
                     */
    
                    /**
                     * Constructs a new KeySet.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a KeySet.
                     * @implements IKeySet
                     * @constructor
                     * @param {google.spanner.v1.IKeySet=} [properties] Properties to set
                     */
                    function KeySet(properties) {
                        this.keys = [];
                        this.ranges = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * KeySet keys.
                     * @member {Array.<google.protobuf.IListValue>} keys
                     * @memberof google.spanner.v1.KeySet
                     * @instance
                     */
                    KeySet.prototype.keys = $util.emptyArray;
    
                    /**
                     * KeySet ranges.
                     * @member {Array.<google.spanner.v1.IKeyRange>} ranges
                     * @memberof google.spanner.v1.KeySet
                     * @instance
                     */
                    KeySet.prototype.ranges = $util.emptyArray;
    
                    /**
                     * KeySet all.
                     * @member {boolean} all
                     * @memberof google.spanner.v1.KeySet
                     * @instance
                     */
                    KeySet.prototype.all = false;
    
                    /**
                     * Creates a new KeySet instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {google.spanner.v1.IKeySet=} [properties] Properties to set
                     * @returns {google.spanner.v1.KeySet} KeySet instance
                     */
                    KeySet.create = function create(properties) {
                        return new KeySet(properties);
                    };
    
                    /**
                     * Encodes the specified KeySet message. Does not implicitly {@link google.spanner.v1.KeySet.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {google.spanner.v1.IKeySet} message KeySet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    KeySet.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.keys != null && message.keys.length)
                            for (var i = 0; i < message.keys.length; ++i)
                                $root.google.protobuf.ListValue.encode(message.keys[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.ranges != null && message.ranges.length)
                            for (var i = 0; i < message.ranges.length; ++i)
                                $root.google.spanner.v1.KeyRange.encode(message.ranges[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.all != null && Object.hasOwnProperty.call(message, "all"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.all);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified KeySet message, length delimited. Does not implicitly {@link google.spanner.v1.KeySet.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {google.spanner.v1.IKeySet} message KeySet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    KeySet.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a KeySet message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.KeySet} KeySet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    KeySet.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.KeySet();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.keys && message.keys.length))
                                        message.keys = [];
                                    message.keys.push($root.google.protobuf.ListValue.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 2: {
                                    if (!(message.ranges && message.ranges.length))
                                        message.ranges = [];
                                    message.ranges.push($root.google.spanner.v1.KeyRange.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 3: {
                                    message.all = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a KeySet message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.KeySet} KeySet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    KeySet.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a KeySet message.
                     * @function verify
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    KeySet.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.keys != null && message.hasOwnProperty("keys")) {
                            if (!Array.isArray(message.keys))
                                return "keys: array expected";
                            for (var i = 0; i < message.keys.length; ++i) {
                                var error = $root.google.protobuf.ListValue.verify(message.keys[i]);
                                if (error)
                                    return "keys." + error;
                            }
                        }
                        if (message.ranges != null && message.hasOwnProperty("ranges")) {
                            if (!Array.isArray(message.ranges))
                                return "ranges: array expected";
                            for (var i = 0; i < message.ranges.length; ++i) {
                                var error = $root.google.spanner.v1.KeyRange.verify(message.ranges[i]);
                                if (error)
                                    return "ranges." + error;
                            }
                        }
                        if (message.all != null && message.hasOwnProperty("all"))
                            if (typeof message.all !== "boolean")
                                return "all: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a KeySet message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.KeySet} KeySet
                     */
                    KeySet.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.KeySet)
                            return object;
                        var message = new $root.google.spanner.v1.KeySet();
                        if (object.keys) {
                            if (!Array.isArray(object.keys))
                                throw TypeError(".google.spanner.v1.KeySet.keys: array expected");
                            message.keys = [];
                            for (var i = 0; i < object.keys.length; ++i) {
                                if (typeof object.keys[i] !== "object")
                                    throw TypeError(".google.spanner.v1.KeySet.keys: object expected");
                                message.keys[i] = $root.google.protobuf.ListValue.fromObject(object.keys[i]);
                            }
                        }
                        if (object.ranges) {
                            if (!Array.isArray(object.ranges))
                                throw TypeError(".google.spanner.v1.KeySet.ranges: array expected");
                            message.ranges = [];
                            for (var i = 0; i < object.ranges.length; ++i) {
                                if (typeof object.ranges[i] !== "object")
                                    throw TypeError(".google.spanner.v1.KeySet.ranges: object expected");
                                message.ranges[i] = $root.google.spanner.v1.KeyRange.fromObject(object.ranges[i]);
                            }
                        }
                        if (object.all != null)
                            message.all = Boolean(object.all);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a KeySet message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {google.spanner.v1.KeySet} message KeySet
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    KeySet.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.keys = [];
                            object.ranges = [];
                        }
                        if (options.defaults)
                            object.all = false;
                        if (message.keys && message.keys.length) {
                            object.keys = [];
                            for (var j = 0; j < message.keys.length; ++j)
                                object.keys[j] = $root.google.protobuf.ListValue.toObject(message.keys[j], options);
                        }
                        if (message.ranges && message.ranges.length) {
                            object.ranges = [];
                            for (var j = 0; j < message.ranges.length; ++j)
                                object.ranges[j] = $root.google.spanner.v1.KeyRange.toObject(message.ranges[j], options);
                        }
                        if (message.all != null && message.hasOwnProperty("all"))
                            object.all = message.all;
                        return object;
                    };
    
                    /**
                     * Converts this KeySet to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.KeySet
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    KeySet.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for KeySet
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.KeySet
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    KeySet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.KeySet";
                    };
    
                    return KeySet;
                })();
    
                v1.Mutation = (function() {
    
                    /**
                     * Properties of a Mutation.
                     * @memberof google.spanner.v1
                     * @interface IMutation
                     * @property {google.spanner.v1.Mutation.IWrite|null} [insert] Mutation insert
                     * @property {google.spanner.v1.Mutation.IWrite|null} [update] Mutation update
                     * @property {google.spanner.v1.Mutation.IWrite|null} [insertOrUpdate] Mutation insertOrUpdate
                     * @property {google.spanner.v1.Mutation.IWrite|null} [replace] Mutation replace
                     * @property {google.spanner.v1.Mutation.IDelete|null} ["delete"] Mutation delete
                     */
    
                    /**
                     * Constructs a new Mutation.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Mutation.
                     * @implements IMutation
                     * @constructor
                     * @param {google.spanner.v1.IMutation=} [properties] Properties to set
                     */
                    function Mutation(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Mutation insert.
                     * @member {google.spanner.v1.Mutation.IWrite|null|undefined} insert
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Mutation.prototype.insert = null;
    
                    /**
                     * Mutation update.
                     * @member {google.spanner.v1.Mutation.IWrite|null|undefined} update
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Mutation.prototype.update = null;
    
                    /**
                     * Mutation insertOrUpdate.
                     * @member {google.spanner.v1.Mutation.IWrite|null|undefined} insertOrUpdate
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Mutation.prototype.insertOrUpdate = null;
    
                    /**
                     * Mutation replace.
                     * @member {google.spanner.v1.Mutation.IWrite|null|undefined} replace
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Mutation.prototype.replace = null;
    
                    /**
                     * Mutation delete.
                     * @member {google.spanner.v1.Mutation.IDelete|null|undefined} delete
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Mutation.prototype["delete"] = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * Mutation operation.
                     * @member {"insert"|"update"|"insertOrUpdate"|"replace"|"delete"|undefined} operation
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     */
                    Object.defineProperty(Mutation.prototype, "operation", {
                        get: $util.oneOfGetter($oneOfFields = ["insert", "update", "insertOrUpdate", "replace", "delete"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new Mutation instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {google.spanner.v1.IMutation=} [properties] Properties to set
                     * @returns {google.spanner.v1.Mutation} Mutation instance
                     */
                    Mutation.create = function create(properties) {
                        return new Mutation(properties);
                    };
    
                    /**
                     * Encodes the specified Mutation message. Does not implicitly {@link google.spanner.v1.Mutation.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {google.spanner.v1.IMutation} message Mutation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Mutation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.insert != null && Object.hasOwnProperty.call(message, "insert"))
                            $root.google.spanner.v1.Mutation.Write.encode(message.insert, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.update != null && Object.hasOwnProperty.call(message, "update"))
                            $root.google.spanner.v1.Mutation.Write.encode(message.update, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.insertOrUpdate != null && Object.hasOwnProperty.call(message, "insertOrUpdate"))
                            $root.google.spanner.v1.Mutation.Write.encode(message.insertOrUpdate, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.replace != null && Object.hasOwnProperty.call(message, "replace"))
                            $root.google.spanner.v1.Mutation.Write.encode(message.replace, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message["delete"] != null && Object.hasOwnProperty.call(message, "delete"))
                            $root.google.spanner.v1.Mutation.Delete.encode(message["delete"], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Mutation message, length delimited. Does not implicitly {@link google.spanner.v1.Mutation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {google.spanner.v1.IMutation} message Mutation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Mutation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Mutation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.Mutation} Mutation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Mutation.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Mutation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.insert = $root.google.spanner.v1.Mutation.Write.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.update = $root.google.spanner.v1.Mutation.Write.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.insertOrUpdate = $root.google.spanner.v1.Mutation.Write.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.replace = $root.google.spanner.v1.Mutation.Write.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message["delete"] = $root.google.spanner.v1.Mutation.Delete.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Mutation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.Mutation} Mutation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Mutation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Mutation message.
                     * @function verify
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Mutation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.insert != null && message.hasOwnProperty("insert")) {
                            properties.operation = 1;
                            {
                                var error = $root.google.spanner.v1.Mutation.Write.verify(message.insert);
                                if (error)
                                    return "insert." + error;
                            }
                        }
                        if (message.update != null && message.hasOwnProperty("update")) {
                            if (properties.operation === 1)
                                return "operation: multiple values";
                            properties.operation = 1;
                            {
                                var error = $root.google.spanner.v1.Mutation.Write.verify(message.update);
                                if (error)
                                    return "update." + error;
                            }
                        }
                        if (message.insertOrUpdate != null && message.hasOwnProperty("insertOrUpdate")) {
                            if (properties.operation === 1)
                                return "operation: multiple values";
                            properties.operation = 1;
                            {
                                var error = $root.google.spanner.v1.Mutation.Write.verify(message.insertOrUpdate);
                                if (error)
                                    return "insertOrUpdate." + error;
                            }
                        }
                        if (message.replace != null && message.hasOwnProperty("replace")) {
                            if (properties.operation === 1)
                                return "operation: multiple values";
                            properties.operation = 1;
                            {
                                var error = $root.google.spanner.v1.Mutation.Write.verify(message.replace);
                                if (error)
                                    return "replace." + error;
                            }
                        }
                        if (message["delete"] != null && message.hasOwnProperty("delete")) {
                            if (properties.operation === 1)
                                return "operation: multiple values";
                            properties.operation = 1;
                            {
                                var error = $root.google.spanner.v1.Mutation.Delete.verify(message["delete"]);
                                if (error)
                                    return "delete." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Mutation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.Mutation} Mutation
                     */
                    Mutation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.Mutation)
                            return object;
                        var message = new $root.google.spanner.v1.Mutation();
                        if (object.insert != null) {
                            if (typeof object.insert !== "object")
                                throw TypeError(".google.spanner.v1.Mutation.insert: object expected");
                            message.insert = $root.google.spanner.v1.Mutation.Write.fromObject(object.insert);
                        }
                        if (object.update != null) {
                            if (typeof object.update !== "object")
                                throw TypeError(".google.spanner.v1.Mutation.update: object expected");
                            message.update = $root.google.spanner.v1.Mutation.Write.fromObject(object.update);
                        }
                        if (object.insertOrUpdate != null) {
                            if (typeof object.insertOrUpdate !== "object")
                                throw TypeError(".google.spanner.v1.Mutation.insertOrUpdate: object expected");
                            message.insertOrUpdate = $root.google.spanner.v1.Mutation.Write.fromObject(object.insertOrUpdate);
                        }
                        if (object.replace != null) {
                            if (typeof object.replace !== "object")
                                throw TypeError(".google.spanner.v1.Mutation.replace: object expected");
                            message.replace = $root.google.spanner.v1.Mutation.Write.fromObject(object.replace);
                        }
                        if (object["delete"] != null) {
                            if (typeof object["delete"] !== "object")
                                throw TypeError(".google.spanner.v1.Mutation.delete: object expected");
                            message["delete"] = $root.google.spanner.v1.Mutation.Delete.fromObject(object["delete"]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Mutation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {google.spanner.v1.Mutation} message Mutation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Mutation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.insert != null && message.hasOwnProperty("insert")) {
                            object.insert = $root.google.spanner.v1.Mutation.Write.toObject(message.insert, options);
                            if (options.oneofs)
                                object.operation = "insert";
                        }
                        if (message.update != null && message.hasOwnProperty("update")) {
                            object.update = $root.google.spanner.v1.Mutation.Write.toObject(message.update, options);
                            if (options.oneofs)
                                object.operation = "update";
                        }
                        if (message.insertOrUpdate != null && message.hasOwnProperty("insertOrUpdate")) {
                            object.insertOrUpdate = $root.google.spanner.v1.Mutation.Write.toObject(message.insertOrUpdate, options);
                            if (options.oneofs)
                                object.operation = "insertOrUpdate";
                        }
                        if (message.replace != null && message.hasOwnProperty("replace")) {
                            object.replace = $root.google.spanner.v1.Mutation.Write.toObject(message.replace, options);
                            if (options.oneofs)
                                object.operation = "replace";
                        }
                        if (message["delete"] != null && message.hasOwnProperty("delete")) {
                            object["delete"] = $root.google.spanner.v1.Mutation.Delete.toObject(message["delete"], options);
                            if (options.oneofs)
                                object.operation = "delete";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Mutation to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.Mutation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Mutation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Mutation
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.Mutation
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Mutation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.Mutation";
                    };
    
                    Mutation.Write = (function() {
    
                        /**
                         * Properties of a Write.
                         * @memberof google.spanner.v1.Mutation
                         * @interface IWrite
                         * @property {string|null} [table] Write table
                         * @property {Array.<string>|null} [columns] Write columns
                         * @property {Array.<google.protobuf.IListValue>|null} [values] Write values
                         */
    
                        /**
                         * Constructs a new Write.
                         * @memberof google.spanner.v1.Mutation
                         * @classdesc Represents a Write.
                         * @implements IWrite
                         * @constructor
                         * @param {google.spanner.v1.Mutation.IWrite=} [properties] Properties to set
                         */
                        function Write(properties) {
                            this.columns = [];
                            this.values = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Write table.
                         * @member {string} table
                         * @memberof google.spanner.v1.Mutation.Write
                         * @instance
                         */
                        Write.prototype.table = "";
    
                        /**
                         * Write columns.
                         * @member {Array.<string>} columns
                         * @memberof google.spanner.v1.Mutation.Write
                         * @instance
                         */
                        Write.prototype.columns = $util.emptyArray;
    
                        /**
                         * Write values.
                         * @member {Array.<google.protobuf.IListValue>} values
                         * @memberof google.spanner.v1.Mutation.Write
                         * @instance
                         */
                        Write.prototype.values = $util.emptyArray;
    
                        /**
                         * Creates a new Write instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {google.spanner.v1.Mutation.IWrite=} [properties] Properties to set
                         * @returns {google.spanner.v1.Mutation.Write} Write instance
                         */
                        Write.create = function create(properties) {
                            return new Write(properties);
                        };
    
                        /**
                         * Encodes the specified Write message. Does not implicitly {@link google.spanner.v1.Mutation.Write.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {google.spanner.v1.Mutation.IWrite} message Write message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Write.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                            if (message.columns != null && message.columns.length)
                                for (var i = 0; i < message.columns.length; ++i)
                                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.columns[i]);
                            if (message.values != null && message.values.length)
                                for (var i = 0; i < message.values.length; ++i)
                                    $root.google.protobuf.ListValue.encode(message.values[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Write message, length delimited. Does not implicitly {@link google.spanner.v1.Mutation.Write.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {google.spanner.v1.Mutation.IWrite} message Write message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Write.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Write message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.Mutation.Write} Write
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Write.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Mutation.Write();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 2: {
                                        if (!(message.columns && message.columns.length))
                                            message.columns = [];
                                        message.columns.push(reader.string());
                                        break;
                                    }
                                case 3: {
                                        if (!(message.values && message.values.length))
                                            message.values = [];
                                        message.values.push($root.google.protobuf.ListValue.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Write message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.Mutation.Write} Write
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Write.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Write message.
                         * @function verify
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Write.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.columns != null && message.hasOwnProperty("columns")) {
                                if (!Array.isArray(message.columns))
                                    return "columns: array expected";
                                for (var i = 0; i < message.columns.length; ++i)
                                    if (!$util.isString(message.columns[i]))
                                        return "columns: string[] expected";
                            }
                            if (message.values != null && message.hasOwnProperty("values")) {
                                if (!Array.isArray(message.values))
                                    return "values: array expected";
                                for (var i = 0; i < message.values.length; ++i) {
                                    var error = $root.google.protobuf.ListValue.verify(message.values[i]);
                                    if (error)
                                        return "values." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a Write message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.Mutation.Write} Write
                         */
                        Write.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.Mutation.Write)
                                return object;
                            var message = new $root.google.spanner.v1.Mutation.Write();
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.columns) {
                                if (!Array.isArray(object.columns))
                                    throw TypeError(".google.spanner.v1.Mutation.Write.columns: array expected");
                                message.columns = [];
                                for (var i = 0; i < object.columns.length; ++i)
                                    message.columns[i] = String(object.columns[i]);
                            }
                            if (object.values) {
                                if (!Array.isArray(object.values))
                                    throw TypeError(".google.spanner.v1.Mutation.Write.values: array expected");
                                message.values = [];
                                for (var i = 0; i < object.values.length; ++i) {
                                    if (typeof object.values[i] !== "object")
                                        throw TypeError(".google.spanner.v1.Mutation.Write.values: object expected");
                                    message.values[i] = $root.google.protobuf.ListValue.fromObject(object.values[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Write message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {google.spanner.v1.Mutation.Write} message Write
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Write.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.columns = [];
                                object.values = [];
                            }
                            if (options.defaults)
                                object.table = "";
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.columns && message.columns.length) {
                                object.columns = [];
                                for (var j = 0; j < message.columns.length; ++j)
                                    object.columns[j] = message.columns[j];
                            }
                            if (message.values && message.values.length) {
                                object.values = [];
                                for (var j = 0; j < message.values.length; ++j)
                                    object.values[j] = $root.google.protobuf.ListValue.toObject(message.values[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this Write to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.Mutation.Write
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Write.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Write
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.Mutation.Write
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Write.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.Mutation.Write";
                        };
    
                        return Write;
                    })();
    
                    Mutation.Delete = (function() {
    
                        /**
                         * Properties of a Delete.
                         * @memberof google.spanner.v1.Mutation
                         * @interface IDelete
                         * @property {string|null} [table] Delete table
                         * @property {google.spanner.v1.IKeySet|null} [keySet] Delete keySet
                         */
    
                        /**
                         * Constructs a new Delete.
                         * @memberof google.spanner.v1.Mutation
                         * @classdesc Represents a Delete.
                         * @implements IDelete
                         * @constructor
                         * @param {google.spanner.v1.Mutation.IDelete=} [properties] Properties to set
                         */
                        function Delete(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Delete table.
                         * @member {string} table
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @instance
                         */
                        Delete.prototype.table = "";
    
                        /**
                         * Delete keySet.
                         * @member {google.spanner.v1.IKeySet|null|undefined} keySet
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @instance
                         */
                        Delete.prototype.keySet = null;
    
                        /**
                         * Creates a new Delete instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {google.spanner.v1.Mutation.IDelete=} [properties] Properties to set
                         * @returns {google.spanner.v1.Mutation.Delete} Delete instance
                         */
                        Delete.create = function create(properties) {
                            return new Delete(properties);
                        };
    
                        /**
                         * Encodes the specified Delete message. Does not implicitly {@link google.spanner.v1.Mutation.Delete.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {google.spanner.v1.Mutation.IDelete} message Delete message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Delete.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.table);
                            if (message.keySet != null && Object.hasOwnProperty.call(message, "keySet"))
                                $root.google.spanner.v1.KeySet.encode(message.keySet, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Delete message, length delimited. Does not implicitly {@link google.spanner.v1.Mutation.Delete.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {google.spanner.v1.Mutation.IDelete} message Delete message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Delete.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Delete message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.Mutation.Delete} Delete
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Delete.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Mutation.Delete();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.keySet = $root.google.spanner.v1.KeySet.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Delete message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.Mutation.Delete} Delete
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Delete.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Delete message.
                         * @function verify
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Delete.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.keySet != null && message.hasOwnProperty("keySet")) {
                                var error = $root.google.spanner.v1.KeySet.verify(message.keySet);
                                if (error)
                                    return "keySet." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a Delete message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.Mutation.Delete} Delete
                         */
                        Delete.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.Mutation.Delete)
                                return object;
                            var message = new $root.google.spanner.v1.Mutation.Delete();
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.keySet != null) {
                                if (typeof object.keySet !== "object")
                                    throw TypeError(".google.spanner.v1.Mutation.Delete.keySet: object expected");
                                message.keySet = $root.google.spanner.v1.KeySet.fromObject(object.keySet);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Delete message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {google.spanner.v1.Mutation.Delete} message Delete
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Delete.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.table = "";
                                object.keySet = null;
                            }
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.keySet != null && message.hasOwnProperty("keySet"))
                                object.keySet = $root.google.spanner.v1.KeySet.toObject(message.keySet, options);
                            return object;
                        };
    
                        /**
                         * Converts this Delete to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Delete.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Delete
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.Mutation.Delete
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Delete.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.Mutation.Delete";
                        };
    
                        return Delete;
                    })();
    
                    return Mutation;
                })();
    
                v1.ResultSet = (function() {
    
                    /**
                     * Properties of a ResultSet.
                     * @memberof google.spanner.v1
                     * @interface IResultSet
                     * @property {google.spanner.v1.IResultSetMetadata|null} [metadata] ResultSet metadata
                     * @property {Array.<google.protobuf.IListValue>|null} [rows] ResultSet rows
                     * @property {google.spanner.v1.IResultSetStats|null} [stats] ResultSet stats
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] ResultSet precommitToken
                     */
    
                    /**
                     * Constructs a new ResultSet.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ResultSet.
                     * @implements IResultSet
                     * @constructor
                     * @param {google.spanner.v1.IResultSet=} [properties] Properties to set
                     */
                    function ResultSet(properties) {
                        this.rows = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ResultSet metadata.
                     * @member {google.spanner.v1.IResultSetMetadata|null|undefined} metadata
                     * @memberof google.spanner.v1.ResultSet
                     * @instance
                     */
                    ResultSet.prototype.metadata = null;
    
                    /**
                     * ResultSet rows.
                     * @member {Array.<google.protobuf.IListValue>} rows
                     * @memberof google.spanner.v1.ResultSet
                     * @instance
                     */
                    ResultSet.prototype.rows = $util.emptyArray;
    
                    /**
                     * ResultSet stats.
                     * @member {google.spanner.v1.IResultSetStats|null|undefined} stats
                     * @memberof google.spanner.v1.ResultSet
                     * @instance
                     */
                    ResultSet.prototype.stats = null;
    
                    /**
                     * ResultSet precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.ResultSet
                     * @instance
                     */
                    ResultSet.prototype.precommitToken = null;
    
                    /**
                     * Creates a new ResultSet instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {google.spanner.v1.IResultSet=} [properties] Properties to set
                     * @returns {google.spanner.v1.ResultSet} ResultSet instance
                     */
                    ResultSet.create = function create(properties) {
                        return new ResultSet(properties);
                    };
    
                    /**
                     * Encodes the specified ResultSet message. Does not implicitly {@link google.spanner.v1.ResultSet.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {google.spanner.v1.IResultSet} message ResultSet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSet.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                            $root.google.spanner.v1.ResultSetMetadata.encode(message.metadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.rows != null && message.rows.length)
                            for (var i = 0; i < message.rows.length; ++i)
                                $root.google.protobuf.ListValue.encode(message.rows[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.stats != null && Object.hasOwnProperty.call(message, "stats"))
                            $root.google.spanner.v1.ResultSetStats.encode(message.stats, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ResultSet message, length delimited. Does not implicitly {@link google.spanner.v1.ResultSet.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {google.spanner.v1.IResultSet} message ResultSet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSet.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ResultSet message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ResultSet} ResultSet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSet.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ResultSet();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.metadata = $root.google.spanner.v1.ResultSetMetadata.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    if (!(message.rows && message.rows.length))
                                        message.rows = [];
                                    message.rows.push($root.google.protobuf.ListValue.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 3: {
                                    message.stats = $root.google.spanner.v1.ResultSetStats.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ResultSet message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ResultSet} ResultSet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSet.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ResultSet message.
                     * @function verify
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ResultSet.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metadata != null && message.hasOwnProperty("metadata")) {
                            var error = $root.google.spanner.v1.ResultSetMetadata.verify(message.metadata);
                            if (error)
                                return "metadata." + error;
                        }
                        if (message.rows != null && message.hasOwnProperty("rows")) {
                            if (!Array.isArray(message.rows))
                                return "rows: array expected";
                            for (var i = 0; i < message.rows.length; ++i) {
                                var error = $root.google.protobuf.ListValue.verify(message.rows[i]);
                                if (error)
                                    return "rows." + error;
                            }
                        }
                        if (message.stats != null && message.hasOwnProperty("stats")) {
                            var error = $root.google.spanner.v1.ResultSetStats.verify(message.stats);
                            if (error)
                                return "stats." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                            if (error)
                                return "precommitToken." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a ResultSet message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ResultSet} ResultSet
                     */
                    ResultSet.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ResultSet)
                            return object;
                        var message = new $root.google.spanner.v1.ResultSet();
                        if (object.metadata != null) {
                            if (typeof object.metadata !== "object")
                                throw TypeError(".google.spanner.v1.ResultSet.metadata: object expected");
                            message.metadata = $root.google.spanner.v1.ResultSetMetadata.fromObject(object.metadata);
                        }
                        if (object.rows) {
                            if (!Array.isArray(object.rows))
                                throw TypeError(".google.spanner.v1.ResultSet.rows: array expected");
                            message.rows = [];
                            for (var i = 0; i < object.rows.length; ++i) {
                                if (typeof object.rows[i] !== "object")
                                    throw TypeError(".google.spanner.v1.ResultSet.rows: object expected");
                                message.rows[i] = $root.google.protobuf.ListValue.fromObject(object.rows[i]);
                            }
                        }
                        if (object.stats != null) {
                            if (typeof object.stats !== "object")
                                throw TypeError(".google.spanner.v1.ResultSet.stats: object expected");
                            message.stats = $root.google.spanner.v1.ResultSetStats.fromObject(object.stats);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.ResultSet.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ResultSet message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {google.spanner.v1.ResultSet} message ResultSet
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ResultSet.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.rows = [];
                        if (options.defaults) {
                            object.metadata = null;
                            object.stats = null;
                            object.precommitToken = null;
                        }
                        if (message.metadata != null && message.hasOwnProperty("metadata"))
                            object.metadata = $root.google.spanner.v1.ResultSetMetadata.toObject(message.metadata, options);
                        if (message.rows && message.rows.length) {
                            object.rows = [];
                            for (var j = 0; j < message.rows.length; ++j)
                                object.rows[j] = $root.google.protobuf.ListValue.toObject(message.rows[j], options);
                        }
                        if (message.stats != null && message.hasOwnProperty("stats"))
                            object.stats = $root.google.spanner.v1.ResultSetStats.toObject(message.stats, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                        return object;
                    };
    
                    /**
                     * Converts this ResultSet to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ResultSet
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ResultSet.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ResultSet
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ResultSet
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ResultSet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ResultSet";
                    };
    
                    return ResultSet;
                })();
    
                v1.PartialResultSet = (function() {
    
                    /**
                     * Properties of a PartialResultSet.
                     * @memberof google.spanner.v1
                     * @interface IPartialResultSet
                     * @property {google.spanner.v1.IResultSetMetadata|null} [metadata] PartialResultSet metadata
                     * @property {Array.<google.protobuf.IValue>|null} [values] PartialResultSet values
                     * @property {boolean|null} [chunkedValue] PartialResultSet chunkedValue
                     * @property {Uint8Array|null} [resumeToken] PartialResultSet resumeToken
                     * @property {google.spanner.v1.IResultSetStats|null} [stats] PartialResultSet stats
                     * @property {google.spanner.v1.IMultiplexedSessionPrecommitToken|null} [precommitToken] PartialResultSet precommitToken
                     * @property {boolean|null} [last] PartialResultSet last
                     */
    
                    /**
                     * Constructs a new PartialResultSet.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PartialResultSet.
                     * @implements IPartialResultSet
                     * @constructor
                     * @param {google.spanner.v1.IPartialResultSet=} [properties] Properties to set
                     */
                    function PartialResultSet(properties) {
                        this.values = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PartialResultSet metadata.
                     * @member {google.spanner.v1.IResultSetMetadata|null|undefined} metadata
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.metadata = null;
    
                    /**
                     * PartialResultSet values.
                     * @member {Array.<google.protobuf.IValue>} values
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.values = $util.emptyArray;
    
                    /**
                     * PartialResultSet chunkedValue.
                     * @member {boolean} chunkedValue
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.chunkedValue = false;
    
                    /**
                     * PartialResultSet resumeToken.
                     * @member {Uint8Array} resumeToken
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.resumeToken = $util.newBuffer([]);
    
                    /**
                     * PartialResultSet stats.
                     * @member {google.spanner.v1.IResultSetStats|null|undefined} stats
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.stats = null;
    
                    /**
                     * PartialResultSet precommitToken.
                     * @member {google.spanner.v1.IMultiplexedSessionPrecommitToken|null|undefined} precommitToken
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.precommitToken = null;
    
                    /**
                     * PartialResultSet last.
                     * @member {boolean} last
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     */
                    PartialResultSet.prototype.last = false;
    
                    /**
                     * Creates a new PartialResultSet instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {google.spanner.v1.IPartialResultSet=} [properties] Properties to set
                     * @returns {google.spanner.v1.PartialResultSet} PartialResultSet instance
                     */
                    PartialResultSet.create = function create(properties) {
                        return new PartialResultSet(properties);
                    };
    
                    /**
                     * Encodes the specified PartialResultSet message. Does not implicitly {@link google.spanner.v1.PartialResultSet.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {google.spanner.v1.IPartialResultSet} message PartialResultSet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartialResultSet.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                            $root.google.spanner.v1.ResultSetMetadata.encode(message.metadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.values != null && message.values.length)
                            for (var i = 0; i < message.values.length; ++i)
                                $root.google.protobuf.Value.encode(message.values[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.chunkedValue != null && Object.hasOwnProperty.call(message, "chunkedValue"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.chunkedValue);
                        if (message.resumeToken != null && Object.hasOwnProperty.call(message, "resumeToken"))
                            writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.resumeToken);
                        if (message.stats != null && Object.hasOwnProperty.call(message, "stats"))
                            $root.google.spanner.v1.ResultSetStats.encode(message.stats, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.precommitToken != null && Object.hasOwnProperty.call(message, "precommitToken"))
                            $root.google.spanner.v1.MultiplexedSessionPrecommitToken.encode(message.precommitToken, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                        if (message.last != null && Object.hasOwnProperty.call(message, "last"))
                            writer.uint32(/* id 9, wireType 0 =*/72).bool(message.last);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PartialResultSet message, length delimited. Does not implicitly {@link google.spanner.v1.PartialResultSet.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {google.spanner.v1.IPartialResultSet} message PartialResultSet message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PartialResultSet.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PartialResultSet message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PartialResultSet} PartialResultSet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartialResultSet.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PartialResultSet();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.metadata = $root.google.spanner.v1.ResultSetMetadata.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    if (!(message.values && message.values.length))
                                        message.values = [];
                                    message.values.push($root.google.protobuf.Value.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 3: {
                                    message.chunkedValue = reader.bool();
                                    break;
                                }
                            case 4: {
                                    message.resumeToken = reader.bytes();
                                    break;
                                }
                            case 5: {
                                    message.stats = $root.google.spanner.v1.ResultSetStats.decode(reader, reader.uint32());
                                    break;
                                }
                            case 8: {
                                    message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.decode(reader, reader.uint32());
                                    break;
                                }
                            case 9: {
                                    message.last = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PartialResultSet message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PartialResultSet} PartialResultSet
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PartialResultSet.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PartialResultSet message.
                     * @function verify
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PartialResultSet.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metadata != null && message.hasOwnProperty("metadata")) {
                            var error = $root.google.spanner.v1.ResultSetMetadata.verify(message.metadata);
                            if (error)
                                return "metadata." + error;
                        }
                        if (message.values != null && message.hasOwnProperty("values")) {
                            if (!Array.isArray(message.values))
                                return "values: array expected";
                            for (var i = 0; i < message.values.length; ++i) {
                                var error = $root.google.protobuf.Value.verify(message.values[i]);
                                if (error)
                                    return "values." + error;
                            }
                        }
                        if (message.chunkedValue != null && message.hasOwnProperty("chunkedValue"))
                            if (typeof message.chunkedValue !== "boolean")
                                return "chunkedValue: boolean expected";
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            if (!(message.resumeToken && typeof message.resumeToken.length === "number" || $util.isString(message.resumeToken)))
                                return "resumeToken: buffer expected";
                        if (message.stats != null && message.hasOwnProperty("stats")) {
                            var error = $root.google.spanner.v1.ResultSetStats.verify(message.stats);
                            if (error)
                                return "stats." + error;
                        }
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken")) {
                            var error = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.verify(message.precommitToken);
                            if (error)
                                return "precommitToken." + error;
                        }
                        if (message.last != null && message.hasOwnProperty("last"))
                            if (typeof message.last !== "boolean")
                                return "last: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a PartialResultSet message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PartialResultSet} PartialResultSet
                     */
                    PartialResultSet.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PartialResultSet)
                            return object;
                        var message = new $root.google.spanner.v1.PartialResultSet();
                        if (object.metadata != null) {
                            if (typeof object.metadata !== "object")
                                throw TypeError(".google.spanner.v1.PartialResultSet.metadata: object expected");
                            message.metadata = $root.google.spanner.v1.ResultSetMetadata.fromObject(object.metadata);
                        }
                        if (object.values) {
                            if (!Array.isArray(object.values))
                                throw TypeError(".google.spanner.v1.PartialResultSet.values: array expected");
                            message.values = [];
                            for (var i = 0; i < object.values.length; ++i) {
                                if (typeof object.values[i] !== "object")
                                    throw TypeError(".google.spanner.v1.PartialResultSet.values: object expected");
                                message.values[i] = $root.google.protobuf.Value.fromObject(object.values[i]);
                            }
                        }
                        if (object.chunkedValue != null)
                            message.chunkedValue = Boolean(object.chunkedValue);
                        if (object.resumeToken != null)
                            if (typeof object.resumeToken === "string")
                                $util.base64.decode(object.resumeToken, message.resumeToken = $util.newBuffer($util.base64.length(object.resumeToken)), 0);
                            else if (object.resumeToken.length >= 0)
                                message.resumeToken = object.resumeToken;
                        if (object.stats != null) {
                            if (typeof object.stats !== "object")
                                throw TypeError(".google.spanner.v1.PartialResultSet.stats: object expected");
                            message.stats = $root.google.spanner.v1.ResultSetStats.fromObject(object.stats);
                        }
                        if (object.precommitToken != null) {
                            if (typeof object.precommitToken !== "object")
                                throw TypeError(".google.spanner.v1.PartialResultSet.precommitToken: object expected");
                            message.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.fromObject(object.precommitToken);
                        }
                        if (object.last != null)
                            message.last = Boolean(object.last);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PartialResultSet message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {google.spanner.v1.PartialResultSet} message PartialResultSet
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PartialResultSet.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.values = [];
                        if (options.defaults) {
                            object.metadata = null;
                            object.chunkedValue = false;
                            if (options.bytes === String)
                                object.resumeToken = "";
                            else {
                                object.resumeToken = [];
                                if (options.bytes !== Array)
                                    object.resumeToken = $util.newBuffer(object.resumeToken);
                            }
                            object.stats = null;
                            object.precommitToken = null;
                            object.last = false;
                        }
                        if (message.metadata != null && message.hasOwnProperty("metadata"))
                            object.metadata = $root.google.spanner.v1.ResultSetMetadata.toObject(message.metadata, options);
                        if (message.values && message.values.length) {
                            object.values = [];
                            for (var j = 0; j < message.values.length; ++j)
                                object.values[j] = $root.google.protobuf.Value.toObject(message.values[j], options);
                        }
                        if (message.chunkedValue != null && message.hasOwnProperty("chunkedValue"))
                            object.chunkedValue = message.chunkedValue;
                        if (message.resumeToken != null && message.hasOwnProperty("resumeToken"))
                            object.resumeToken = options.bytes === String ? $util.base64.encode(message.resumeToken, 0, message.resumeToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.resumeToken) : message.resumeToken;
                        if (message.stats != null && message.hasOwnProperty("stats"))
                            object.stats = $root.google.spanner.v1.ResultSetStats.toObject(message.stats, options);
                        if (message.precommitToken != null && message.hasOwnProperty("precommitToken"))
                            object.precommitToken = $root.google.spanner.v1.MultiplexedSessionPrecommitToken.toObject(message.precommitToken, options);
                        if (message.last != null && message.hasOwnProperty("last"))
                            object.last = message.last;
                        return object;
                    };
    
                    /**
                     * Converts this PartialResultSet to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PartialResultSet
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PartialResultSet.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PartialResultSet
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PartialResultSet
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PartialResultSet.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PartialResultSet";
                    };
    
                    return PartialResultSet;
                })();
    
                v1.ResultSetMetadata = (function() {
    
                    /**
                     * Properties of a ResultSetMetadata.
                     * @memberof google.spanner.v1
                     * @interface IResultSetMetadata
                     * @property {google.spanner.v1.IStructType|null} [rowType] ResultSetMetadata rowType
                     * @property {google.spanner.v1.ITransaction|null} [transaction] ResultSetMetadata transaction
                     * @property {google.spanner.v1.IStructType|null} [undeclaredParameters] ResultSetMetadata undeclaredParameters
                     */
    
                    /**
                     * Constructs a new ResultSetMetadata.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ResultSetMetadata.
                     * @implements IResultSetMetadata
                     * @constructor
                     * @param {google.spanner.v1.IResultSetMetadata=} [properties] Properties to set
                     */
                    function ResultSetMetadata(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ResultSetMetadata rowType.
                     * @member {google.spanner.v1.IStructType|null|undefined} rowType
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @instance
                     */
                    ResultSetMetadata.prototype.rowType = null;
    
                    /**
                     * ResultSetMetadata transaction.
                     * @member {google.spanner.v1.ITransaction|null|undefined} transaction
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @instance
                     */
                    ResultSetMetadata.prototype.transaction = null;
    
                    /**
                     * ResultSetMetadata undeclaredParameters.
                     * @member {google.spanner.v1.IStructType|null|undefined} undeclaredParameters
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @instance
                     */
                    ResultSetMetadata.prototype.undeclaredParameters = null;
    
                    /**
                     * Creates a new ResultSetMetadata instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {google.spanner.v1.IResultSetMetadata=} [properties] Properties to set
                     * @returns {google.spanner.v1.ResultSetMetadata} ResultSetMetadata instance
                     */
                    ResultSetMetadata.create = function create(properties) {
                        return new ResultSetMetadata(properties);
                    };
    
                    /**
                     * Encodes the specified ResultSetMetadata message. Does not implicitly {@link google.spanner.v1.ResultSetMetadata.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {google.spanner.v1.IResultSetMetadata} message ResultSetMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSetMetadata.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.rowType != null && Object.hasOwnProperty.call(message, "rowType"))
                            $root.google.spanner.v1.StructType.encode(message.rowType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.transaction != null && Object.hasOwnProperty.call(message, "transaction"))
                            $root.google.spanner.v1.Transaction.encode(message.transaction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.undeclaredParameters != null && Object.hasOwnProperty.call(message, "undeclaredParameters"))
                            $root.google.spanner.v1.StructType.encode(message.undeclaredParameters, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ResultSetMetadata message, length delimited. Does not implicitly {@link google.spanner.v1.ResultSetMetadata.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {google.spanner.v1.IResultSetMetadata} message ResultSetMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSetMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ResultSetMetadata message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ResultSetMetadata} ResultSetMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSetMetadata.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ResultSetMetadata();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.rowType = $root.google.spanner.v1.StructType.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.transaction = $root.google.spanner.v1.Transaction.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.undeclaredParameters = $root.google.spanner.v1.StructType.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ResultSetMetadata message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ResultSetMetadata} ResultSetMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSetMetadata.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ResultSetMetadata message.
                     * @function verify
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ResultSetMetadata.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.rowType != null && message.hasOwnProperty("rowType")) {
                            var error = $root.google.spanner.v1.StructType.verify(message.rowType);
                            if (error)
                                return "rowType." + error;
                        }
                        if (message.transaction != null && message.hasOwnProperty("transaction")) {
                            var error = $root.google.spanner.v1.Transaction.verify(message.transaction);
                            if (error)
                                return "transaction." + error;
                        }
                        if (message.undeclaredParameters != null && message.hasOwnProperty("undeclaredParameters")) {
                            var error = $root.google.spanner.v1.StructType.verify(message.undeclaredParameters);
                            if (error)
                                return "undeclaredParameters." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a ResultSetMetadata message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ResultSetMetadata} ResultSetMetadata
                     */
                    ResultSetMetadata.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ResultSetMetadata)
                            return object;
                        var message = new $root.google.spanner.v1.ResultSetMetadata();
                        if (object.rowType != null) {
                            if (typeof object.rowType !== "object")
                                throw TypeError(".google.spanner.v1.ResultSetMetadata.rowType: object expected");
                            message.rowType = $root.google.spanner.v1.StructType.fromObject(object.rowType);
                        }
                        if (object.transaction != null) {
                            if (typeof object.transaction !== "object")
                                throw TypeError(".google.spanner.v1.ResultSetMetadata.transaction: object expected");
                            message.transaction = $root.google.spanner.v1.Transaction.fromObject(object.transaction);
                        }
                        if (object.undeclaredParameters != null) {
                            if (typeof object.undeclaredParameters !== "object")
                                throw TypeError(".google.spanner.v1.ResultSetMetadata.undeclaredParameters: object expected");
                            message.undeclaredParameters = $root.google.spanner.v1.StructType.fromObject(object.undeclaredParameters);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ResultSetMetadata message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {google.spanner.v1.ResultSetMetadata} message ResultSetMetadata
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ResultSetMetadata.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.rowType = null;
                            object.transaction = null;
                            object.undeclaredParameters = null;
                        }
                        if (message.rowType != null && message.hasOwnProperty("rowType"))
                            object.rowType = $root.google.spanner.v1.StructType.toObject(message.rowType, options);
                        if (message.transaction != null && message.hasOwnProperty("transaction"))
                            object.transaction = $root.google.spanner.v1.Transaction.toObject(message.transaction, options);
                        if (message.undeclaredParameters != null && message.hasOwnProperty("undeclaredParameters"))
                            object.undeclaredParameters = $root.google.spanner.v1.StructType.toObject(message.undeclaredParameters, options);
                        return object;
                    };
    
                    /**
                     * Converts this ResultSetMetadata to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ResultSetMetadata.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ResultSetMetadata
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ResultSetMetadata
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ResultSetMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ResultSetMetadata";
                    };
    
                    return ResultSetMetadata;
                })();
    
                v1.ResultSetStats = (function() {
    
                    /**
                     * Properties of a ResultSetStats.
                     * @memberof google.spanner.v1
                     * @interface IResultSetStats
                     * @property {google.spanner.v1.IQueryPlan|null} [queryPlan] ResultSetStats queryPlan
                     * @property {google.protobuf.IStruct|null} [queryStats] ResultSetStats queryStats
                     * @property {number|Long|null} [rowCountExact] ResultSetStats rowCountExact
                     * @property {number|Long|null} [rowCountLowerBound] ResultSetStats rowCountLowerBound
                     */
    
                    /**
                     * Constructs a new ResultSetStats.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ResultSetStats.
                     * @implements IResultSetStats
                     * @constructor
                     * @param {google.spanner.v1.IResultSetStats=} [properties] Properties to set
                     */
                    function ResultSetStats(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ResultSetStats queryPlan.
                     * @member {google.spanner.v1.IQueryPlan|null|undefined} queryPlan
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     */
                    ResultSetStats.prototype.queryPlan = null;
    
                    /**
                     * ResultSetStats queryStats.
                     * @member {google.protobuf.IStruct|null|undefined} queryStats
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     */
                    ResultSetStats.prototype.queryStats = null;
    
                    /**
                     * ResultSetStats rowCountExact.
                     * @member {number|Long|null|undefined} rowCountExact
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     */
                    ResultSetStats.prototype.rowCountExact = null;
    
                    /**
                     * ResultSetStats rowCountLowerBound.
                     * @member {number|Long|null|undefined} rowCountLowerBound
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     */
                    ResultSetStats.prototype.rowCountLowerBound = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * ResultSetStats rowCount.
                     * @member {"rowCountExact"|"rowCountLowerBound"|undefined} rowCount
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     */
                    Object.defineProperty(ResultSetStats.prototype, "rowCount", {
                        get: $util.oneOfGetter($oneOfFields = ["rowCountExact", "rowCountLowerBound"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new ResultSetStats instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {google.spanner.v1.IResultSetStats=} [properties] Properties to set
                     * @returns {google.spanner.v1.ResultSetStats} ResultSetStats instance
                     */
                    ResultSetStats.create = function create(properties) {
                        return new ResultSetStats(properties);
                    };
    
                    /**
                     * Encodes the specified ResultSetStats message. Does not implicitly {@link google.spanner.v1.ResultSetStats.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {google.spanner.v1.IResultSetStats} message ResultSetStats message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSetStats.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.queryPlan != null && Object.hasOwnProperty.call(message, "queryPlan"))
                            $root.google.spanner.v1.QueryPlan.encode(message.queryPlan, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.queryStats != null && Object.hasOwnProperty.call(message, "queryStats"))
                            $root.google.protobuf.Struct.encode(message.queryStats, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.rowCountExact != null && Object.hasOwnProperty.call(message, "rowCountExact"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int64(message.rowCountExact);
                        if (message.rowCountLowerBound != null && Object.hasOwnProperty.call(message, "rowCountLowerBound"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int64(message.rowCountLowerBound);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ResultSetStats message, length delimited. Does not implicitly {@link google.spanner.v1.ResultSetStats.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {google.spanner.v1.IResultSetStats} message ResultSetStats message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ResultSetStats.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ResultSetStats message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ResultSetStats} ResultSetStats
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSetStats.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ResultSetStats();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.queryPlan = $root.google.spanner.v1.QueryPlan.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.queryStats = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.rowCountExact = reader.int64();
                                    break;
                                }
                            case 4: {
                                    message.rowCountLowerBound = reader.int64();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ResultSetStats message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ResultSetStats} ResultSetStats
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ResultSetStats.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ResultSetStats message.
                     * @function verify
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ResultSetStats.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.queryPlan != null && message.hasOwnProperty("queryPlan")) {
                            var error = $root.google.spanner.v1.QueryPlan.verify(message.queryPlan);
                            if (error)
                                return "queryPlan." + error;
                        }
                        if (message.queryStats != null && message.hasOwnProperty("queryStats")) {
                            var error = $root.google.protobuf.Struct.verify(message.queryStats);
                            if (error)
                                return "queryStats." + error;
                        }
                        if (message.rowCountExact != null && message.hasOwnProperty("rowCountExact")) {
                            properties.rowCount = 1;
                            if (!$util.isInteger(message.rowCountExact) && !(message.rowCountExact && $util.isInteger(message.rowCountExact.low) && $util.isInteger(message.rowCountExact.high)))
                                return "rowCountExact: integer|Long expected";
                        }
                        if (message.rowCountLowerBound != null && message.hasOwnProperty("rowCountLowerBound")) {
                            if (properties.rowCount === 1)
                                return "rowCount: multiple values";
                            properties.rowCount = 1;
                            if (!$util.isInteger(message.rowCountLowerBound) && !(message.rowCountLowerBound && $util.isInteger(message.rowCountLowerBound.low) && $util.isInteger(message.rowCountLowerBound.high)))
                                return "rowCountLowerBound: integer|Long expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a ResultSetStats message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ResultSetStats} ResultSetStats
                     */
                    ResultSetStats.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ResultSetStats)
                            return object;
                        var message = new $root.google.spanner.v1.ResultSetStats();
                        if (object.queryPlan != null) {
                            if (typeof object.queryPlan !== "object")
                                throw TypeError(".google.spanner.v1.ResultSetStats.queryPlan: object expected");
                            message.queryPlan = $root.google.spanner.v1.QueryPlan.fromObject(object.queryPlan);
                        }
                        if (object.queryStats != null) {
                            if (typeof object.queryStats !== "object")
                                throw TypeError(".google.spanner.v1.ResultSetStats.queryStats: object expected");
                            message.queryStats = $root.google.protobuf.Struct.fromObject(object.queryStats);
                        }
                        if (object.rowCountExact != null)
                            if ($util.Long)
                                (message.rowCountExact = $util.Long.fromValue(object.rowCountExact)).unsigned = false;
                            else if (typeof object.rowCountExact === "string")
                                message.rowCountExact = parseInt(object.rowCountExact, 10);
                            else if (typeof object.rowCountExact === "number")
                                message.rowCountExact = object.rowCountExact;
                            else if (typeof object.rowCountExact === "object")
                                message.rowCountExact = new $util.LongBits(object.rowCountExact.low >>> 0, object.rowCountExact.high >>> 0).toNumber();
                        if (object.rowCountLowerBound != null)
                            if ($util.Long)
                                (message.rowCountLowerBound = $util.Long.fromValue(object.rowCountLowerBound)).unsigned = false;
                            else if (typeof object.rowCountLowerBound === "string")
                                message.rowCountLowerBound = parseInt(object.rowCountLowerBound, 10);
                            else if (typeof object.rowCountLowerBound === "number")
                                message.rowCountLowerBound = object.rowCountLowerBound;
                            else if (typeof object.rowCountLowerBound === "object")
                                message.rowCountLowerBound = new $util.LongBits(object.rowCountLowerBound.low >>> 0, object.rowCountLowerBound.high >>> 0).toNumber();
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ResultSetStats message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {google.spanner.v1.ResultSetStats} message ResultSetStats
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ResultSetStats.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.queryPlan = null;
                            object.queryStats = null;
                        }
                        if (message.queryPlan != null && message.hasOwnProperty("queryPlan"))
                            object.queryPlan = $root.google.spanner.v1.QueryPlan.toObject(message.queryPlan, options);
                        if (message.queryStats != null && message.hasOwnProperty("queryStats"))
                            object.queryStats = $root.google.protobuf.Struct.toObject(message.queryStats, options);
                        if (message.rowCountExact != null && message.hasOwnProperty("rowCountExact")) {
                            if (typeof message.rowCountExact === "number")
                                object.rowCountExact = options.longs === String ? String(message.rowCountExact) : message.rowCountExact;
                            else
                                object.rowCountExact = options.longs === String ? $util.Long.prototype.toString.call(message.rowCountExact) : options.longs === Number ? new $util.LongBits(message.rowCountExact.low >>> 0, message.rowCountExact.high >>> 0).toNumber() : message.rowCountExact;
                            if (options.oneofs)
                                object.rowCount = "rowCountExact";
                        }
                        if (message.rowCountLowerBound != null && message.hasOwnProperty("rowCountLowerBound")) {
                            if (typeof message.rowCountLowerBound === "number")
                                object.rowCountLowerBound = options.longs === String ? String(message.rowCountLowerBound) : message.rowCountLowerBound;
                            else
                                object.rowCountLowerBound = options.longs === String ? $util.Long.prototype.toString.call(message.rowCountLowerBound) : options.longs === Number ? new $util.LongBits(message.rowCountLowerBound.low >>> 0, message.rowCountLowerBound.high >>> 0).toNumber() : message.rowCountLowerBound;
                            if (options.oneofs)
                                object.rowCount = "rowCountLowerBound";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this ResultSetStats to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ResultSetStats
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ResultSetStats.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ResultSetStats
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ResultSetStats
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ResultSetStats.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ResultSetStats";
                    };
    
                    return ResultSetStats;
                })();
    
                v1.PlanNode = (function() {
    
                    /**
                     * Properties of a PlanNode.
                     * @memberof google.spanner.v1
                     * @interface IPlanNode
                     * @property {number|null} [index] PlanNode index
                     * @property {google.spanner.v1.PlanNode.Kind|null} [kind] PlanNode kind
                     * @property {string|null} [displayName] PlanNode displayName
                     * @property {Array.<google.spanner.v1.PlanNode.IChildLink>|null} [childLinks] PlanNode childLinks
                     * @property {google.spanner.v1.PlanNode.IShortRepresentation|null} [shortRepresentation] PlanNode shortRepresentation
                     * @property {google.protobuf.IStruct|null} [metadata] PlanNode metadata
                     * @property {google.protobuf.IStruct|null} [executionStats] PlanNode executionStats
                     */
    
                    /**
                     * Constructs a new PlanNode.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a PlanNode.
                     * @implements IPlanNode
                     * @constructor
                     * @param {google.spanner.v1.IPlanNode=} [properties] Properties to set
                     */
                    function PlanNode(properties) {
                        this.childLinks = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PlanNode index.
                     * @member {number} index
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.index = 0;
    
                    /**
                     * PlanNode kind.
                     * @member {google.spanner.v1.PlanNode.Kind} kind
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.kind = 0;
    
                    /**
                     * PlanNode displayName.
                     * @member {string} displayName
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.displayName = "";
    
                    /**
                     * PlanNode childLinks.
                     * @member {Array.<google.spanner.v1.PlanNode.IChildLink>} childLinks
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.childLinks = $util.emptyArray;
    
                    /**
                     * PlanNode shortRepresentation.
                     * @member {google.spanner.v1.PlanNode.IShortRepresentation|null|undefined} shortRepresentation
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.shortRepresentation = null;
    
                    /**
                     * PlanNode metadata.
                     * @member {google.protobuf.IStruct|null|undefined} metadata
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.metadata = null;
    
                    /**
                     * PlanNode executionStats.
                     * @member {google.protobuf.IStruct|null|undefined} executionStats
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     */
                    PlanNode.prototype.executionStats = null;
    
                    /**
                     * Creates a new PlanNode instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {google.spanner.v1.IPlanNode=} [properties] Properties to set
                     * @returns {google.spanner.v1.PlanNode} PlanNode instance
                     */
                    PlanNode.create = function create(properties) {
                        return new PlanNode(properties);
                    };
    
                    /**
                     * Encodes the specified PlanNode message. Does not implicitly {@link google.spanner.v1.PlanNode.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {google.spanner.v1.IPlanNode} message PlanNode message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PlanNode.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.index);
                        if (message.kind != null && Object.hasOwnProperty.call(message, "kind"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.kind);
                        if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.displayName);
                        if (message.childLinks != null && message.childLinks.length)
                            for (var i = 0; i < message.childLinks.length; ++i)
                                $root.google.spanner.v1.PlanNode.ChildLink.encode(message.childLinks[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.shortRepresentation != null && Object.hasOwnProperty.call(message, "shortRepresentation"))
                            $root.google.spanner.v1.PlanNode.ShortRepresentation.encode(message.shortRepresentation, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                            $root.google.protobuf.Struct.encode(message.metadata, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        if (message.executionStats != null && Object.hasOwnProperty.call(message, "executionStats"))
                            $root.google.protobuf.Struct.encode(message.executionStats, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PlanNode message, length delimited. Does not implicitly {@link google.spanner.v1.PlanNode.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {google.spanner.v1.IPlanNode} message PlanNode message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PlanNode.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PlanNode message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.PlanNode} PlanNode
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PlanNode.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PlanNode();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.index = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.kind = reader.int32();
                                    break;
                                }
                            case 3: {
                                    message.displayName = reader.string();
                                    break;
                                }
                            case 4: {
                                    if (!(message.childLinks && message.childLinks.length))
                                        message.childLinks = [];
                                    message.childLinks.push($root.google.spanner.v1.PlanNode.ChildLink.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 5: {
                                    message.shortRepresentation = $root.google.spanner.v1.PlanNode.ShortRepresentation.decode(reader, reader.uint32());
                                    break;
                                }
                            case 6: {
                                    message.metadata = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                    break;
                                }
                            case 7: {
                                    message.executionStats = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PlanNode message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.PlanNode} PlanNode
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PlanNode.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PlanNode message.
                     * @function verify
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PlanNode.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.index != null && message.hasOwnProperty("index"))
                            if (!$util.isInteger(message.index))
                                return "index: integer expected";
                        if (message.kind != null && message.hasOwnProperty("kind"))
                            switch (message.kind) {
                            default:
                                return "kind: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.displayName != null && message.hasOwnProperty("displayName"))
                            if (!$util.isString(message.displayName))
                                return "displayName: string expected";
                        if (message.childLinks != null && message.hasOwnProperty("childLinks")) {
                            if (!Array.isArray(message.childLinks))
                                return "childLinks: array expected";
                            for (var i = 0; i < message.childLinks.length; ++i) {
                                var error = $root.google.spanner.v1.PlanNode.ChildLink.verify(message.childLinks[i]);
                                if (error)
                                    return "childLinks." + error;
                            }
                        }
                        if (message.shortRepresentation != null && message.hasOwnProperty("shortRepresentation")) {
                            var error = $root.google.spanner.v1.PlanNode.ShortRepresentation.verify(message.shortRepresentation);
                            if (error)
                                return "shortRepresentation." + error;
                        }
                        if (message.metadata != null && message.hasOwnProperty("metadata")) {
                            var error = $root.google.protobuf.Struct.verify(message.metadata);
                            if (error)
                                return "metadata." + error;
                        }
                        if (message.executionStats != null && message.hasOwnProperty("executionStats")) {
                            var error = $root.google.protobuf.Struct.verify(message.executionStats);
                            if (error)
                                return "executionStats." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a PlanNode message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.PlanNode} PlanNode
                     */
                    PlanNode.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.PlanNode)
                            return object;
                        var message = new $root.google.spanner.v1.PlanNode();
                        if (object.index != null)
                            message.index = object.index | 0;
                        switch (object.kind) {
                        default:
                            if (typeof object.kind === "number") {
                                message.kind = object.kind;
                                break;
                            }
                            break;
                        case "KIND_UNSPECIFIED":
                        case 0:
                            message.kind = 0;
                            break;
                        case "RELATIONAL":
                        case 1:
                            message.kind = 1;
                            break;
                        case "SCALAR":
                        case 2:
                            message.kind = 2;
                            break;
                        }
                        if (object.displayName != null)
                            message.displayName = String(object.displayName);
                        if (object.childLinks) {
                            if (!Array.isArray(object.childLinks))
                                throw TypeError(".google.spanner.v1.PlanNode.childLinks: array expected");
                            message.childLinks = [];
                            for (var i = 0; i < object.childLinks.length; ++i) {
                                if (typeof object.childLinks[i] !== "object")
                                    throw TypeError(".google.spanner.v1.PlanNode.childLinks: object expected");
                                message.childLinks[i] = $root.google.spanner.v1.PlanNode.ChildLink.fromObject(object.childLinks[i]);
                            }
                        }
                        if (object.shortRepresentation != null) {
                            if (typeof object.shortRepresentation !== "object")
                                throw TypeError(".google.spanner.v1.PlanNode.shortRepresentation: object expected");
                            message.shortRepresentation = $root.google.spanner.v1.PlanNode.ShortRepresentation.fromObject(object.shortRepresentation);
                        }
                        if (object.metadata != null) {
                            if (typeof object.metadata !== "object")
                                throw TypeError(".google.spanner.v1.PlanNode.metadata: object expected");
                            message.metadata = $root.google.protobuf.Struct.fromObject(object.metadata);
                        }
                        if (object.executionStats != null) {
                            if (typeof object.executionStats !== "object")
                                throw TypeError(".google.spanner.v1.PlanNode.executionStats: object expected");
                            message.executionStats = $root.google.protobuf.Struct.fromObject(object.executionStats);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PlanNode message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {google.spanner.v1.PlanNode} message PlanNode
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PlanNode.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.childLinks = [];
                        if (options.defaults) {
                            object.index = 0;
                            object.kind = options.enums === String ? "KIND_UNSPECIFIED" : 0;
                            object.displayName = "";
                            object.shortRepresentation = null;
                            object.metadata = null;
                            object.executionStats = null;
                        }
                        if (message.index != null && message.hasOwnProperty("index"))
                            object.index = message.index;
                        if (message.kind != null && message.hasOwnProperty("kind"))
                            object.kind = options.enums === String ? $root.google.spanner.v1.PlanNode.Kind[message.kind] === undefined ? message.kind : $root.google.spanner.v1.PlanNode.Kind[message.kind] : message.kind;
                        if (message.displayName != null && message.hasOwnProperty("displayName"))
                            object.displayName = message.displayName;
                        if (message.childLinks && message.childLinks.length) {
                            object.childLinks = [];
                            for (var j = 0; j < message.childLinks.length; ++j)
                                object.childLinks[j] = $root.google.spanner.v1.PlanNode.ChildLink.toObject(message.childLinks[j], options);
                        }
                        if (message.shortRepresentation != null && message.hasOwnProperty("shortRepresentation"))
                            object.shortRepresentation = $root.google.spanner.v1.PlanNode.ShortRepresentation.toObject(message.shortRepresentation, options);
                        if (message.metadata != null && message.hasOwnProperty("metadata"))
                            object.metadata = $root.google.protobuf.Struct.toObject(message.metadata, options);
                        if (message.executionStats != null && message.hasOwnProperty("executionStats"))
                            object.executionStats = $root.google.protobuf.Struct.toObject(message.executionStats, options);
                        return object;
                    };
    
                    /**
                     * Converts this PlanNode to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.PlanNode
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PlanNode.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PlanNode
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.PlanNode
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PlanNode.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.PlanNode";
                    };
    
                    /**
                     * Kind enum.
                     * @name google.spanner.v1.PlanNode.Kind
                     * @enum {number}
                     * @property {number} KIND_UNSPECIFIED=0 KIND_UNSPECIFIED value
                     * @property {number} RELATIONAL=1 RELATIONAL value
                     * @property {number} SCALAR=2 SCALAR value
                     */
                    PlanNode.Kind = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "KIND_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "RELATIONAL"] = 1;
                        values[valuesById[2] = "SCALAR"] = 2;
                        return values;
                    })();
    
                    PlanNode.ChildLink = (function() {
    
                        /**
                         * Properties of a ChildLink.
                         * @memberof google.spanner.v1.PlanNode
                         * @interface IChildLink
                         * @property {number|null} [childIndex] ChildLink childIndex
                         * @property {string|null} [type] ChildLink type
                         * @property {string|null} [variable] ChildLink variable
                         */
    
                        /**
                         * Constructs a new ChildLink.
                         * @memberof google.spanner.v1.PlanNode
                         * @classdesc Represents a ChildLink.
                         * @implements IChildLink
                         * @constructor
                         * @param {google.spanner.v1.PlanNode.IChildLink=} [properties] Properties to set
                         */
                        function ChildLink(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ChildLink childIndex.
                         * @member {number} childIndex
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @instance
                         */
                        ChildLink.prototype.childIndex = 0;
    
                        /**
                         * ChildLink type.
                         * @member {string} type
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @instance
                         */
                        ChildLink.prototype.type = "";
    
                        /**
                         * ChildLink variable.
                         * @member {string} variable
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @instance
                         */
                        ChildLink.prototype.variable = "";
    
                        /**
                         * Creates a new ChildLink instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {google.spanner.v1.PlanNode.IChildLink=} [properties] Properties to set
                         * @returns {google.spanner.v1.PlanNode.ChildLink} ChildLink instance
                         */
                        ChildLink.create = function create(properties) {
                            return new ChildLink(properties);
                        };
    
                        /**
                         * Encodes the specified ChildLink message. Does not implicitly {@link google.spanner.v1.PlanNode.ChildLink.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {google.spanner.v1.PlanNode.IChildLink} message ChildLink message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChildLink.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.childIndex != null && Object.hasOwnProperty.call(message, "childIndex"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.childIndex);
                            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.type);
                            if (message.variable != null && Object.hasOwnProperty.call(message, "variable"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.variable);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ChildLink message, length delimited. Does not implicitly {@link google.spanner.v1.PlanNode.ChildLink.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {google.spanner.v1.PlanNode.IChildLink} message ChildLink message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ChildLink.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ChildLink message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.PlanNode.ChildLink} ChildLink
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChildLink.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PlanNode.ChildLink();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.childIndex = reader.int32();
                                        break;
                                    }
                                case 2: {
                                        message.type = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.variable = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ChildLink message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.PlanNode.ChildLink} ChildLink
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ChildLink.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ChildLink message.
                         * @function verify
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ChildLink.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.childIndex != null && message.hasOwnProperty("childIndex"))
                                if (!$util.isInteger(message.childIndex))
                                    return "childIndex: integer expected";
                            if (message.type != null && message.hasOwnProperty("type"))
                                if (!$util.isString(message.type))
                                    return "type: string expected";
                            if (message.variable != null && message.hasOwnProperty("variable"))
                                if (!$util.isString(message.variable))
                                    return "variable: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a ChildLink message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.PlanNode.ChildLink} ChildLink
                         */
                        ChildLink.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.PlanNode.ChildLink)
                                return object;
                            var message = new $root.google.spanner.v1.PlanNode.ChildLink();
                            if (object.childIndex != null)
                                message.childIndex = object.childIndex | 0;
                            if (object.type != null)
                                message.type = String(object.type);
                            if (object.variable != null)
                                message.variable = String(object.variable);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ChildLink message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {google.spanner.v1.PlanNode.ChildLink} message ChildLink
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ChildLink.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.childIndex = 0;
                                object.type = "";
                                object.variable = "";
                            }
                            if (message.childIndex != null && message.hasOwnProperty("childIndex"))
                                object.childIndex = message.childIndex;
                            if (message.type != null && message.hasOwnProperty("type"))
                                object.type = message.type;
                            if (message.variable != null && message.hasOwnProperty("variable"))
                                object.variable = message.variable;
                            return object;
                        };
    
                        /**
                         * Converts this ChildLink to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ChildLink.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ChildLink
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.PlanNode.ChildLink
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ChildLink.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.PlanNode.ChildLink";
                        };
    
                        return ChildLink;
                    })();
    
                    PlanNode.ShortRepresentation = (function() {
    
                        /**
                         * Properties of a ShortRepresentation.
                         * @memberof google.spanner.v1.PlanNode
                         * @interface IShortRepresentation
                         * @property {string|null} [description] ShortRepresentation description
                         * @property {Object.<string,number>|null} [subqueries] ShortRepresentation subqueries
                         */
    
                        /**
                         * Constructs a new ShortRepresentation.
                         * @memberof google.spanner.v1.PlanNode
                         * @classdesc Represents a ShortRepresentation.
                         * @implements IShortRepresentation
                         * @constructor
                         * @param {google.spanner.v1.PlanNode.IShortRepresentation=} [properties] Properties to set
                         */
                        function ShortRepresentation(properties) {
                            this.subqueries = {};
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * ShortRepresentation description.
                         * @member {string} description
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @instance
                         */
                        ShortRepresentation.prototype.description = "";
    
                        /**
                         * ShortRepresentation subqueries.
                         * @member {Object.<string,number>} subqueries
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @instance
                         */
                        ShortRepresentation.prototype.subqueries = $util.emptyObject;
    
                        /**
                         * Creates a new ShortRepresentation instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {google.spanner.v1.PlanNode.IShortRepresentation=} [properties] Properties to set
                         * @returns {google.spanner.v1.PlanNode.ShortRepresentation} ShortRepresentation instance
                         */
                        ShortRepresentation.create = function create(properties) {
                            return new ShortRepresentation(properties);
                        };
    
                        /**
                         * Encodes the specified ShortRepresentation message. Does not implicitly {@link google.spanner.v1.PlanNode.ShortRepresentation.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {google.spanner.v1.PlanNode.IShortRepresentation} message ShortRepresentation message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ShortRepresentation.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.description);
                            if (message.subqueries != null && Object.hasOwnProperty.call(message, "subqueries"))
                                for (var keys = Object.keys(message.subqueries), i = 0; i < keys.length; ++i)
                                    writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 0 =*/16).int32(message.subqueries[keys[i]]).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified ShortRepresentation message, length delimited. Does not implicitly {@link google.spanner.v1.PlanNode.ShortRepresentation.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {google.spanner.v1.PlanNode.IShortRepresentation} message ShortRepresentation message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        ShortRepresentation.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a ShortRepresentation message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.PlanNode.ShortRepresentation} ShortRepresentation
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ShortRepresentation.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.PlanNode.ShortRepresentation(), key, value;
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.description = reader.string();
                                        break;
                                    }
                                case 2: {
                                        if (message.subqueries === $util.emptyObject)
                                            message.subqueries = {};
                                        var end2 = reader.uint32() + reader.pos;
                                        key = "";
                                        value = 0;
                                        while (reader.pos < end2) {
                                            var tag2 = reader.uint32();
                                            switch (tag2 >>> 3) {
                                            case 1:
                                                key = reader.string();
                                                break;
                                            case 2:
                                                value = reader.int32();
                                                break;
                                            default:
                                                reader.skipType(tag2 & 7);
                                                break;
                                            }
                                        }
                                        message.subqueries[key] = value;
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a ShortRepresentation message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.PlanNode.ShortRepresentation} ShortRepresentation
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        ShortRepresentation.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a ShortRepresentation message.
                         * @function verify
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        ShortRepresentation.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.description != null && message.hasOwnProperty("description"))
                                if (!$util.isString(message.description))
                                    return "description: string expected";
                            if (message.subqueries != null && message.hasOwnProperty("subqueries")) {
                                if (!$util.isObject(message.subqueries))
                                    return "subqueries: object expected";
                                var key = Object.keys(message.subqueries);
                                for (var i = 0; i < key.length; ++i)
                                    if (!$util.isInteger(message.subqueries[key[i]]))
                                        return "subqueries: integer{k:string} expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a ShortRepresentation message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.PlanNode.ShortRepresentation} ShortRepresentation
                         */
                        ShortRepresentation.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.PlanNode.ShortRepresentation)
                                return object;
                            var message = new $root.google.spanner.v1.PlanNode.ShortRepresentation();
                            if (object.description != null)
                                message.description = String(object.description);
                            if (object.subqueries) {
                                if (typeof object.subqueries !== "object")
                                    throw TypeError(".google.spanner.v1.PlanNode.ShortRepresentation.subqueries: object expected");
                                message.subqueries = {};
                                for (var keys = Object.keys(object.subqueries), i = 0; i < keys.length; ++i)
                                    message.subqueries[keys[i]] = object.subqueries[keys[i]] | 0;
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a ShortRepresentation message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {google.spanner.v1.PlanNode.ShortRepresentation} message ShortRepresentation
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        ShortRepresentation.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.objects || options.defaults)
                                object.subqueries = {};
                            if (options.defaults)
                                object.description = "";
                            if (message.description != null && message.hasOwnProperty("description"))
                                object.description = message.description;
                            var keys2;
                            if (message.subqueries && (keys2 = Object.keys(message.subqueries)).length) {
                                object.subqueries = {};
                                for (var j = 0; j < keys2.length; ++j)
                                    object.subqueries[keys2[j]] = message.subqueries[keys2[j]];
                            }
                            return object;
                        };
    
                        /**
                         * Converts this ShortRepresentation to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        ShortRepresentation.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for ShortRepresentation
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.PlanNode.ShortRepresentation
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        ShortRepresentation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.PlanNode.ShortRepresentation";
                        };
    
                        return ShortRepresentation;
                    })();
    
                    return PlanNode;
                })();
    
                v1.QueryPlan = (function() {
    
                    /**
                     * Properties of a QueryPlan.
                     * @memberof google.spanner.v1
                     * @interface IQueryPlan
                     * @property {Array.<google.spanner.v1.IPlanNode>|null} [planNodes] QueryPlan planNodes
                     */
    
                    /**
                     * Constructs a new QueryPlan.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a QueryPlan.
                     * @implements IQueryPlan
                     * @constructor
                     * @param {google.spanner.v1.IQueryPlan=} [properties] Properties to set
                     */
                    function QueryPlan(properties) {
                        this.planNodes = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * QueryPlan planNodes.
                     * @member {Array.<google.spanner.v1.IPlanNode>} planNodes
                     * @memberof google.spanner.v1.QueryPlan
                     * @instance
                     */
                    QueryPlan.prototype.planNodes = $util.emptyArray;
    
                    /**
                     * Creates a new QueryPlan instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {google.spanner.v1.IQueryPlan=} [properties] Properties to set
                     * @returns {google.spanner.v1.QueryPlan} QueryPlan instance
                     */
                    QueryPlan.create = function create(properties) {
                        return new QueryPlan(properties);
                    };
    
                    /**
                     * Encodes the specified QueryPlan message. Does not implicitly {@link google.spanner.v1.QueryPlan.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {google.spanner.v1.IQueryPlan} message QueryPlan message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    QueryPlan.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.planNodes != null && message.planNodes.length)
                            for (var i = 0; i < message.planNodes.length; ++i)
                                $root.google.spanner.v1.PlanNode.encode(message.planNodes[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified QueryPlan message, length delimited. Does not implicitly {@link google.spanner.v1.QueryPlan.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {google.spanner.v1.IQueryPlan} message QueryPlan message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    QueryPlan.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a QueryPlan message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.QueryPlan} QueryPlan
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    QueryPlan.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.QueryPlan();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.planNodes && message.planNodes.length))
                                        message.planNodes = [];
                                    message.planNodes.push($root.google.spanner.v1.PlanNode.decode(reader, reader.uint32()));
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a QueryPlan message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.QueryPlan} QueryPlan
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    QueryPlan.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a QueryPlan message.
                     * @function verify
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    QueryPlan.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.planNodes != null && message.hasOwnProperty("planNodes")) {
                            if (!Array.isArray(message.planNodes))
                                return "planNodes: array expected";
                            for (var i = 0; i < message.planNodes.length; ++i) {
                                var error = $root.google.spanner.v1.PlanNode.verify(message.planNodes[i]);
                                if (error)
                                    return "planNodes." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a QueryPlan message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.QueryPlan} QueryPlan
                     */
                    QueryPlan.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.QueryPlan)
                            return object;
                        var message = new $root.google.spanner.v1.QueryPlan();
                        if (object.planNodes) {
                            if (!Array.isArray(object.planNodes))
                                throw TypeError(".google.spanner.v1.QueryPlan.planNodes: array expected");
                            message.planNodes = [];
                            for (var i = 0; i < object.planNodes.length; ++i) {
                                if (typeof object.planNodes[i] !== "object")
                                    throw TypeError(".google.spanner.v1.QueryPlan.planNodes: object expected");
                                message.planNodes[i] = $root.google.spanner.v1.PlanNode.fromObject(object.planNodes[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a QueryPlan message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {google.spanner.v1.QueryPlan} message QueryPlan
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    QueryPlan.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.planNodes = [];
                        if (message.planNodes && message.planNodes.length) {
                            object.planNodes = [];
                            for (var j = 0; j < message.planNodes.length; ++j)
                                object.planNodes[j] = $root.google.spanner.v1.PlanNode.toObject(message.planNodes[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this QueryPlan to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.QueryPlan
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    QueryPlan.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for QueryPlan
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.QueryPlan
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    QueryPlan.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.QueryPlan";
                    };
    
                    return QueryPlan;
                })();
    
                v1.Type = (function() {
    
                    /**
                     * Properties of a Type.
                     * @memberof google.spanner.v1
                     * @interface IType
                     * @property {google.spanner.v1.TypeCode|null} [code] Type code
                     * @property {google.spanner.v1.IType|null} [arrayElementType] Type arrayElementType
                     * @property {google.spanner.v1.IStructType|null} [structType] Type structType
                     * @property {google.spanner.v1.TypeAnnotationCode|null} [typeAnnotation] Type typeAnnotation
                     * @property {string|null} [protoTypeFqn] Type protoTypeFqn
                     */
    
                    /**
                     * Constructs a new Type.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a Type.
                     * @implements IType
                     * @constructor
                     * @param {google.spanner.v1.IType=} [properties] Properties to set
                     */
                    function Type(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Type code.
                     * @member {google.spanner.v1.TypeCode} code
                     * @memberof google.spanner.v1.Type
                     * @instance
                     */
                    Type.prototype.code = 0;
    
                    /**
                     * Type arrayElementType.
                     * @member {google.spanner.v1.IType|null|undefined} arrayElementType
                     * @memberof google.spanner.v1.Type
                     * @instance
                     */
                    Type.prototype.arrayElementType = null;
    
                    /**
                     * Type structType.
                     * @member {google.spanner.v1.IStructType|null|undefined} structType
                     * @memberof google.spanner.v1.Type
                     * @instance
                     */
                    Type.prototype.structType = null;
    
                    /**
                     * Type typeAnnotation.
                     * @member {google.spanner.v1.TypeAnnotationCode} typeAnnotation
                     * @memberof google.spanner.v1.Type
                     * @instance
                     */
                    Type.prototype.typeAnnotation = 0;
    
                    /**
                     * Type protoTypeFqn.
                     * @member {string} protoTypeFqn
                     * @memberof google.spanner.v1.Type
                     * @instance
                     */
                    Type.prototype.protoTypeFqn = "";
    
                    /**
                     * Creates a new Type instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {google.spanner.v1.IType=} [properties] Properties to set
                     * @returns {google.spanner.v1.Type} Type instance
                     */
                    Type.create = function create(properties) {
                        return new Type(properties);
                    };
    
                    /**
                     * Encodes the specified Type message. Does not implicitly {@link google.spanner.v1.Type.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {google.spanner.v1.IType} message Type message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Type.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.code != null && Object.hasOwnProperty.call(message, "code"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.code);
                        if (message.arrayElementType != null && Object.hasOwnProperty.call(message, "arrayElementType"))
                            $root.google.spanner.v1.Type.encode(message.arrayElementType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.structType != null && Object.hasOwnProperty.call(message, "structType"))
                            $root.google.spanner.v1.StructType.encode(message.structType, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.typeAnnotation != null && Object.hasOwnProperty.call(message, "typeAnnotation"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.typeAnnotation);
                        if (message.protoTypeFqn != null && Object.hasOwnProperty.call(message, "protoTypeFqn"))
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.protoTypeFqn);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Type message, length delimited. Does not implicitly {@link google.spanner.v1.Type.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {google.spanner.v1.IType} message Type message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Type.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Type message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.Type} Type
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Type.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.Type();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.code = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.arrayElementType = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.structType = $root.google.spanner.v1.StructType.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.typeAnnotation = reader.int32();
                                    break;
                                }
                            case 5: {
                                    message.protoTypeFqn = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Type message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.Type} Type
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Type.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Type message.
                     * @function verify
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Type.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.code != null && message.hasOwnProperty("code"))
                            switch (message.code) {
                            default:
                                return "code: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 15:
                            case 4:
                            case 5:
                            case 6:
                            case 7:
                            case 8:
                            case 9:
                            case 10:
                            case 11:
                            case 13:
                            case 14:
                            case 16:
                            case 17:
                                break;
                            }
                        if (message.arrayElementType != null && message.hasOwnProperty("arrayElementType")) {
                            var error = $root.google.spanner.v1.Type.verify(message.arrayElementType);
                            if (error)
                                return "arrayElementType." + error;
                        }
                        if (message.structType != null && message.hasOwnProperty("structType")) {
                            var error = $root.google.spanner.v1.StructType.verify(message.structType);
                            if (error)
                                return "structType." + error;
                        }
                        if (message.typeAnnotation != null && message.hasOwnProperty("typeAnnotation"))
                            switch (message.typeAnnotation) {
                            default:
                                return "typeAnnotation: enum value expected";
                            case 0:
                            case 2:
                            case 3:
                            case 4:
                                break;
                            }
                        if (message.protoTypeFqn != null && message.hasOwnProperty("protoTypeFqn"))
                            if (!$util.isString(message.protoTypeFqn))
                                return "protoTypeFqn: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a Type message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.Type} Type
                     */
                    Type.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.Type)
                            return object;
                        var message = new $root.google.spanner.v1.Type();
                        switch (object.code) {
                        default:
                            if (typeof object.code === "number") {
                                message.code = object.code;
                                break;
                            }
                            break;
                        case "TYPE_CODE_UNSPECIFIED":
                        case 0:
                            message.code = 0;
                            break;
                        case "BOOL":
                        case 1:
                            message.code = 1;
                            break;
                        case "INT64":
                        case 2:
                            message.code = 2;
                            break;
                        case "FLOAT64":
                        case 3:
                            message.code = 3;
                            break;
                        case "FLOAT32":
                        case 15:
                            message.code = 15;
                            break;
                        case "TIMESTAMP":
                        case 4:
                            message.code = 4;
                            break;
                        case "DATE":
                        case 5:
                            message.code = 5;
                            break;
                        case "STRING":
                        case 6:
                            message.code = 6;
                            break;
                        case "BYTES":
                        case 7:
                            message.code = 7;
                            break;
                        case "ARRAY":
                        case 8:
                            message.code = 8;
                            break;
                        case "STRUCT":
                        case 9:
                            message.code = 9;
                            break;
                        case "NUMERIC":
                        case 10:
                            message.code = 10;
                            break;
                        case "JSON":
                        case 11:
                            message.code = 11;
                            break;
                        case "PROTO":
                        case 13:
                            message.code = 13;
                            break;
                        case "ENUM":
                        case 14:
                            message.code = 14;
                            break;
                        case "INTERVAL":
                        case 16:
                            message.code = 16;
                            break;
                        case "UUID":
                        case 17:
                            message.code = 17;
                            break;
                        }
                        if (object.arrayElementType != null) {
                            if (typeof object.arrayElementType !== "object")
                                throw TypeError(".google.spanner.v1.Type.arrayElementType: object expected");
                            message.arrayElementType = $root.google.spanner.v1.Type.fromObject(object.arrayElementType);
                        }
                        if (object.structType != null) {
                            if (typeof object.structType !== "object")
                                throw TypeError(".google.spanner.v1.Type.structType: object expected");
                            message.structType = $root.google.spanner.v1.StructType.fromObject(object.structType);
                        }
                        switch (object.typeAnnotation) {
                        default:
                            if (typeof object.typeAnnotation === "number") {
                                message.typeAnnotation = object.typeAnnotation;
                                break;
                            }
                            break;
                        case "TYPE_ANNOTATION_CODE_UNSPECIFIED":
                        case 0:
                            message.typeAnnotation = 0;
                            break;
                        case "PG_NUMERIC":
                        case 2:
                            message.typeAnnotation = 2;
                            break;
                        case "PG_JSONB":
                        case 3:
                            message.typeAnnotation = 3;
                            break;
                        case "PG_OID":
                        case 4:
                            message.typeAnnotation = 4;
                            break;
                        }
                        if (object.protoTypeFqn != null)
                            message.protoTypeFqn = String(object.protoTypeFqn);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Type message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {google.spanner.v1.Type} message Type
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Type.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.code = options.enums === String ? "TYPE_CODE_UNSPECIFIED" : 0;
                            object.arrayElementType = null;
                            object.structType = null;
                            object.typeAnnotation = options.enums === String ? "TYPE_ANNOTATION_CODE_UNSPECIFIED" : 0;
                            object.protoTypeFqn = "";
                        }
                        if (message.code != null && message.hasOwnProperty("code"))
                            object.code = options.enums === String ? $root.google.spanner.v1.TypeCode[message.code] === undefined ? message.code : $root.google.spanner.v1.TypeCode[message.code] : message.code;
                        if (message.arrayElementType != null && message.hasOwnProperty("arrayElementType"))
                            object.arrayElementType = $root.google.spanner.v1.Type.toObject(message.arrayElementType, options);
                        if (message.structType != null && message.hasOwnProperty("structType"))
                            object.structType = $root.google.spanner.v1.StructType.toObject(message.structType, options);
                        if (message.typeAnnotation != null && message.hasOwnProperty("typeAnnotation"))
                            object.typeAnnotation = options.enums === String ? $root.google.spanner.v1.TypeAnnotationCode[message.typeAnnotation] === undefined ? message.typeAnnotation : $root.google.spanner.v1.TypeAnnotationCode[message.typeAnnotation] : message.typeAnnotation;
                        if (message.protoTypeFqn != null && message.hasOwnProperty("protoTypeFqn"))
                            object.protoTypeFqn = message.protoTypeFqn;
                        return object;
                    };
    
                    /**
                     * Converts this Type to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.Type
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Type.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Type
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.Type
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Type.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.Type";
                    };
    
                    return Type;
                })();
    
                v1.StructType = (function() {
    
                    /**
                     * Properties of a StructType.
                     * @memberof google.spanner.v1
                     * @interface IStructType
                     * @property {Array.<google.spanner.v1.StructType.IField>|null} [fields] StructType fields
                     */
    
                    /**
                     * Constructs a new StructType.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a StructType.
                     * @implements IStructType
                     * @constructor
                     * @param {google.spanner.v1.IStructType=} [properties] Properties to set
                     */
                    function StructType(properties) {
                        this.fields = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * StructType fields.
                     * @member {Array.<google.spanner.v1.StructType.IField>} fields
                     * @memberof google.spanner.v1.StructType
                     * @instance
                     */
                    StructType.prototype.fields = $util.emptyArray;
    
                    /**
                     * Creates a new StructType instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {google.spanner.v1.IStructType=} [properties] Properties to set
                     * @returns {google.spanner.v1.StructType} StructType instance
                     */
                    StructType.create = function create(properties) {
                        return new StructType(properties);
                    };
    
                    /**
                     * Encodes the specified StructType message. Does not implicitly {@link google.spanner.v1.StructType.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {google.spanner.v1.IStructType} message StructType message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    StructType.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.fields != null && message.fields.length)
                            for (var i = 0; i < message.fields.length; ++i)
                                $root.google.spanner.v1.StructType.Field.encode(message.fields[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified StructType message, length delimited. Does not implicitly {@link google.spanner.v1.StructType.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {google.spanner.v1.IStructType} message StructType message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    StructType.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a StructType message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.StructType} StructType
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    StructType.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.StructType();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.fields && message.fields.length))
                                        message.fields = [];
                                    message.fields.push($root.google.spanner.v1.StructType.Field.decode(reader, reader.uint32()));
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a StructType message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.StructType} StructType
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    StructType.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a StructType message.
                     * @function verify
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    StructType.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.fields != null && message.hasOwnProperty("fields")) {
                            if (!Array.isArray(message.fields))
                                return "fields: array expected";
                            for (var i = 0; i < message.fields.length; ++i) {
                                var error = $root.google.spanner.v1.StructType.Field.verify(message.fields[i]);
                                if (error)
                                    return "fields." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a StructType message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.StructType} StructType
                     */
                    StructType.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.StructType)
                            return object;
                        var message = new $root.google.spanner.v1.StructType();
                        if (object.fields) {
                            if (!Array.isArray(object.fields))
                                throw TypeError(".google.spanner.v1.StructType.fields: array expected");
                            message.fields = [];
                            for (var i = 0; i < object.fields.length; ++i) {
                                if (typeof object.fields[i] !== "object")
                                    throw TypeError(".google.spanner.v1.StructType.fields: object expected");
                                message.fields[i] = $root.google.spanner.v1.StructType.Field.fromObject(object.fields[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a StructType message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {google.spanner.v1.StructType} message StructType
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    StructType.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.fields = [];
                        if (message.fields && message.fields.length) {
                            object.fields = [];
                            for (var j = 0; j < message.fields.length; ++j)
                                object.fields[j] = $root.google.spanner.v1.StructType.Field.toObject(message.fields[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this StructType to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.StructType
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    StructType.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for StructType
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.StructType
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    StructType.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.StructType";
                    };
    
                    StructType.Field = (function() {
    
                        /**
                         * Properties of a Field.
                         * @memberof google.spanner.v1.StructType
                         * @interface IField
                         * @property {string|null} [name] Field name
                         * @property {google.spanner.v1.IType|null} [type] Field type
                         */
    
                        /**
                         * Constructs a new Field.
                         * @memberof google.spanner.v1.StructType
                         * @classdesc Represents a Field.
                         * @implements IField
                         * @constructor
                         * @param {google.spanner.v1.StructType.IField=} [properties] Properties to set
                         */
                        function Field(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Field name.
                         * @member {string} name
                         * @memberof google.spanner.v1.StructType.Field
                         * @instance
                         */
                        Field.prototype.name = "";
    
                        /**
                         * Field type.
                         * @member {google.spanner.v1.IType|null|undefined} type
                         * @memberof google.spanner.v1.StructType.Field
                         * @instance
                         */
                        Field.prototype.type = null;
    
                        /**
                         * Creates a new Field instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {google.spanner.v1.StructType.IField=} [properties] Properties to set
                         * @returns {google.spanner.v1.StructType.Field} Field instance
                         */
                        Field.create = function create(properties) {
                            return new Field(properties);
                        };
    
                        /**
                         * Encodes the specified Field message. Does not implicitly {@link google.spanner.v1.StructType.Field.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {google.spanner.v1.StructType.IField} message Field message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Field.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                $root.google.spanner.v1.Type.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Field message, length delimited. Does not implicitly {@link google.spanner.v1.StructType.Field.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {google.spanner.v1.StructType.IField} message Field message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Field.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Field message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.StructType.Field} Field
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Field.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.StructType.Field();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.name = reader.string();
                                        break;
                                    }
                                case 2: {
                                        message.type = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Field message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.StructType.Field} Field
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Field.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Field message.
                         * @function verify
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Field.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.name != null && message.hasOwnProperty("name"))
                                if (!$util.isString(message.name))
                                    return "name: string expected";
                            if (message.type != null && message.hasOwnProperty("type")) {
                                var error = $root.google.spanner.v1.Type.verify(message.type);
                                if (error)
                                    return "type." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a Field message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.StructType.Field} Field
                         */
                        Field.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.StructType.Field)
                                return object;
                            var message = new $root.google.spanner.v1.StructType.Field();
                            if (object.name != null)
                                message.name = String(object.name);
                            if (object.type != null) {
                                if (typeof object.type !== "object")
                                    throw TypeError(".google.spanner.v1.StructType.Field.type: object expected");
                                message.type = $root.google.spanner.v1.Type.fromObject(object.type);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Field message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {google.spanner.v1.StructType.Field} message Field
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Field.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.name = "";
                                object.type = null;
                            }
                            if (message.name != null && message.hasOwnProperty("name"))
                                object.name = message.name;
                            if (message.type != null && message.hasOwnProperty("type"))
                                object.type = $root.google.spanner.v1.Type.toObject(message.type, options);
                            return object;
                        };
    
                        /**
                         * Converts this Field to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.StructType.Field
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Field.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for Field
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.StructType.Field
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        Field.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.StructType.Field";
                        };
    
                        return Field;
                    })();
    
                    return StructType;
                })();
    
                /**
                 * TypeCode enum.
                 * @name google.spanner.v1.TypeCode
                 * @enum {number}
                 * @property {number} TYPE_CODE_UNSPECIFIED=0 TYPE_CODE_UNSPECIFIED value
                 * @property {number} BOOL=1 BOOL value
                 * @property {number} INT64=2 INT64 value
                 * @property {number} FLOAT64=3 FLOAT64 value
                 * @property {number} FLOAT32=15 FLOAT32 value
                 * @property {number} TIMESTAMP=4 TIMESTAMP value
                 * @property {number} DATE=5 DATE value
                 * @property {number} STRING=6 STRING value
                 * @property {number} BYTES=7 BYTES value
                 * @property {number} ARRAY=8 ARRAY value
                 * @property {number} STRUCT=9 STRUCT value
                 * @property {number} NUMERIC=10 NUMERIC value
                 * @property {number} JSON=11 JSON value
                 * @property {number} PROTO=13 PROTO value
                 * @property {number} ENUM=14 ENUM value
                 * @property {number} INTERVAL=16 INTERVAL value
                 * @property {number} UUID=17 UUID value
                 */
                v1.TypeCode = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "TYPE_CODE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "BOOL"] = 1;
                    values[valuesById[2] = "INT64"] = 2;
                    values[valuesById[3] = "FLOAT64"] = 3;
                    values[valuesById[15] = "FLOAT32"] = 15;
                    values[valuesById[4] = "TIMESTAMP"] = 4;
                    values[valuesById[5] = "DATE"] = 5;
                    values[valuesById[6] = "STRING"] = 6;
                    values[valuesById[7] = "BYTES"] = 7;
                    values[valuesById[8] = "ARRAY"] = 8;
                    values[valuesById[9] = "STRUCT"] = 9;
                    values[valuesById[10] = "NUMERIC"] = 10;
                    values[valuesById[11] = "JSON"] = 11;
                    values[valuesById[13] = "PROTO"] = 13;
                    values[valuesById[14] = "ENUM"] = 14;
                    values[valuesById[16] = "INTERVAL"] = 16;
                    values[valuesById[17] = "UUID"] = 17;
                    return values;
                })();
    
                /**
                 * TypeAnnotationCode enum.
                 * @name google.spanner.v1.TypeAnnotationCode
                 * @enum {number}
                 * @property {number} TYPE_ANNOTATION_CODE_UNSPECIFIED=0 TYPE_ANNOTATION_CODE_UNSPECIFIED value
                 * @property {number} PG_NUMERIC=2 PG_NUMERIC value
                 * @property {number} PG_JSONB=3 PG_JSONB value
                 * @property {number} PG_OID=4 PG_OID value
                 */
                v1.TypeAnnotationCode = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "TYPE_ANNOTATION_CODE_UNSPECIFIED"] = 0;
                    values[valuesById[2] = "PG_NUMERIC"] = 2;
                    values[valuesById[3] = "PG_JSONB"] = 3;
                    values[valuesById[4] = "PG_OID"] = 4;
                    return values;
                })();
    
                v1.ChangeStreamRecord = (function() {
    
                    /**
                     * Properties of a ChangeStreamRecord.
                     * @memberof google.spanner.v1
                     * @interface IChangeStreamRecord
                     * @property {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord|null} [dataChangeRecord] ChangeStreamRecord dataChangeRecord
                     * @property {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord|null} [heartbeatRecord] ChangeStreamRecord heartbeatRecord
                     * @property {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord|null} [partitionStartRecord] ChangeStreamRecord partitionStartRecord
                     * @property {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord|null} [partitionEndRecord] ChangeStreamRecord partitionEndRecord
                     * @property {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord|null} [partitionEventRecord] ChangeStreamRecord partitionEventRecord
                     */
    
                    /**
                     * Constructs a new ChangeStreamRecord.
                     * @memberof google.spanner.v1
                     * @classdesc Represents a ChangeStreamRecord.
                     * @implements IChangeStreamRecord
                     * @constructor
                     * @param {google.spanner.v1.IChangeStreamRecord=} [properties] Properties to set
                     */
                    function ChangeStreamRecord(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ChangeStreamRecord dataChangeRecord.
                     * @member {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord|null|undefined} dataChangeRecord
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    ChangeStreamRecord.prototype.dataChangeRecord = null;
    
                    /**
                     * ChangeStreamRecord heartbeatRecord.
                     * @member {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord|null|undefined} heartbeatRecord
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    ChangeStreamRecord.prototype.heartbeatRecord = null;
    
                    /**
                     * ChangeStreamRecord partitionStartRecord.
                     * @member {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord|null|undefined} partitionStartRecord
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    ChangeStreamRecord.prototype.partitionStartRecord = null;
    
                    /**
                     * ChangeStreamRecord partitionEndRecord.
                     * @member {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord|null|undefined} partitionEndRecord
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    ChangeStreamRecord.prototype.partitionEndRecord = null;
    
                    /**
                     * ChangeStreamRecord partitionEventRecord.
                     * @member {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord|null|undefined} partitionEventRecord
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    ChangeStreamRecord.prototype.partitionEventRecord = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * ChangeStreamRecord record.
                     * @member {"dataChangeRecord"|"heartbeatRecord"|"partitionStartRecord"|"partitionEndRecord"|"partitionEventRecord"|undefined} record
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     */
                    Object.defineProperty(ChangeStreamRecord.prototype, "record", {
                        get: $util.oneOfGetter($oneOfFields = ["dataChangeRecord", "heartbeatRecord", "partitionStartRecord", "partitionEndRecord", "partitionEventRecord"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new ChangeStreamRecord instance using the specified properties.
                     * @function create
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {google.spanner.v1.IChangeStreamRecord=} [properties] Properties to set
                     * @returns {google.spanner.v1.ChangeStreamRecord} ChangeStreamRecord instance
                     */
                    ChangeStreamRecord.create = function create(properties) {
                        return new ChangeStreamRecord(properties);
                    };
    
                    /**
                     * Encodes the specified ChangeStreamRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.verify|verify} messages.
                     * @function encode
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {google.spanner.v1.IChangeStreamRecord} message ChangeStreamRecord message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ChangeStreamRecord.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.dataChangeRecord != null && Object.hasOwnProperty.call(message, "dataChangeRecord"))
                            $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.encode(message.dataChangeRecord, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.heartbeatRecord != null && Object.hasOwnProperty.call(message, "heartbeatRecord"))
                            $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.encode(message.heartbeatRecord, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.partitionStartRecord != null && Object.hasOwnProperty.call(message, "partitionStartRecord"))
                            $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.encode(message.partitionStartRecord, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.partitionEndRecord != null && Object.hasOwnProperty.call(message, "partitionEndRecord"))
                            $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.encode(message.partitionEndRecord, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.partitionEventRecord != null && Object.hasOwnProperty.call(message, "partitionEventRecord"))
                            $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.encode(message.partitionEventRecord, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ChangeStreamRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {google.spanner.v1.IChangeStreamRecord} message ChangeStreamRecord message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ChangeStreamRecord.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ChangeStreamRecord message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.spanner.v1.ChangeStreamRecord} ChangeStreamRecord
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ChangeStreamRecord.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.dataChangeRecord = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.heartbeatRecord = $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.partitionStartRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.partitionEndRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.decode(reader, reader.uint32());
                                    break;
                                }
                            case 5: {
                                    message.partitionEventRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ChangeStreamRecord message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.spanner.v1.ChangeStreamRecord} ChangeStreamRecord
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ChangeStreamRecord.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ChangeStreamRecord message.
                     * @function verify
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ChangeStreamRecord.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.dataChangeRecord != null && message.hasOwnProperty("dataChangeRecord")) {
                            properties.record = 1;
                            {
                                var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.verify(message.dataChangeRecord);
                                if (error)
                                    return "dataChangeRecord." + error;
                            }
                        }
                        if (message.heartbeatRecord != null && message.hasOwnProperty("heartbeatRecord")) {
                            if (properties.record === 1)
                                return "record: multiple values";
                            properties.record = 1;
                            {
                                var error = $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.verify(message.heartbeatRecord);
                                if (error)
                                    return "heartbeatRecord." + error;
                            }
                        }
                        if (message.partitionStartRecord != null && message.hasOwnProperty("partitionStartRecord")) {
                            if (properties.record === 1)
                                return "record: multiple values";
                            properties.record = 1;
                            {
                                var error = $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.verify(message.partitionStartRecord);
                                if (error)
                                    return "partitionStartRecord." + error;
                            }
                        }
                        if (message.partitionEndRecord != null && message.hasOwnProperty("partitionEndRecord")) {
                            if (properties.record === 1)
                                return "record: multiple values";
                            properties.record = 1;
                            {
                                var error = $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.verify(message.partitionEndRecord);
                                if (error)
                                    return "partitionEndRecord." + error;
                            }
                        }
                        if (message.partitionEventRecord != null && message.hasOwnProperty("partitionEventRecord")) {
                            if (properties.record === 1)
                                return "record: multiple values";
                            properties.record = 1;
                            {
                                var error = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.verify(message.partitionEventRecord);
                                if (error)
                                    return "partitionEventRecord." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a ChangeStreamRecord message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.spanner.v1.ChangeStreamRecord} ChangeStreamRecord
                     */
                    ChangeStreamRecord.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.spanner.v1.ChangeStreamRecord)
                            return object;
                        var message = new $root.google.spanner.v1.ChangeStreamRecord();
                        if (object.dataChangeRecord != null) {
                            if (typeof object.dataChangeRecord !== "object")
                                throw TypeError(".google.spanner.v1.ChangeStreamRecord.dataChangeRecord: object expected");
                            message.dataChangeRecord = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.fromObject(object.dataChangeRecord);
                        }
                        if (object.heartbeatRecord != null) {
                            if (typeof object.heartbeatRecord !== "object")
                                throw TypeError(".google.spanner.v1.ChangeStreamRecord.heartbeatRecord: object expected");
                            message.heartbeatRecord = $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.fromObject(object.heartbeatRecord);
                        }
                        if (object.partitionStartRecord != null) {
                            if (typeof object.partitionStartRecord !== "object")
                                throw TypeError(".google.spanner.v1.ChangeStreamRecord.partitionStartRecord: object expected");
                            message.partitionStartRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.fromObject(object.partitionStartRecord);
                        }
                        if (object.partitionEndRecord != null) {
                            if (typeof object.partitionEndRecord !== "object")
                                throw TypeError(".google.spanner.v1.ChangeStreamRecord.partitionEndRecord: object expected");
                            message.partitionEndRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.fromObject(object.partitionEndRecord);
                        }
                        if (object.partitionEventRecord != null) {
                            if (typeof object.partitionEventRecord !== "object")
                                throw TypeError(".google.spanner.v1.ChangeStreamRecord.partitionEventRecord: object expected");
                            message.partitionEventRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.fromObject(object.partitionEventRecord);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ChangeStreamRecord message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {google.spanner.v1.ChangeStreamRecord} message ChangeStreamRecord
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ChangeStreamRecord.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.dataChangeRecord != null && message.hasOwnProperty("dataChangeRecord")) {
                            object.dataChangeRecord = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.toObject(message.dataChangeRecord, options);
                            if (options.oneofs)
                                object.record = "dataChangeRecord";
                        }
                        if (message.heartbeatRecord != null && message.hasOwnProperty("heartbeatRecord")) {
                            object.heartbeatRecord = $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.toObject(message.heartbeatRecord, options);
                            if (options.oneofs)
                                object.record = "heartbeatRecord";
                        }
                        if (message.partitionStartRecord != null && message.hasOwnProperty("partitionStartRecord")) {
                            object.partitionStartRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.toObject(message.partitionStartRecord, options);
                            if (options.oneofs)
                                object.record = "partitionStartRecord";
                        }
                        if (message.partitionEndRecord != null && message.hasOwnProperty("partitionEndRecord")) {
                            object.partitionEndRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.toObject(message.partitionEndRecord, options);
                            if (options.oneofs)
                                object.record = "partitionEndRecord";
                        }
                        if (message.partitionEventRecord != null && message.hasOwnProperty("partitionEventRecord")) {
                            object.partitionEventRecord = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.toObject(message.partitionEventRecord, options);
                            if (options.oneofs)
                                object.record = "partitionEventRecord";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this ChangeStreamRecord to JSON.
                     * @function toJSON
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ChangeStreamRecord.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ChangeStreamRecord
                     * @function getTypeUrl
                     * @memberof google.spanner.v1.ChangeStreamRecord
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ChangeStreamRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord";
                    };
    
                    ChangeStreamRecord.DataChangeRecord = (function() {
    
                        /**
                         * Properties of a DataChangeRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @interface IDataChangeRecord
                         * @property {google.protobuf.ITimestamp|null} [commitTimestamp] DataChangeRecord commitTimestamp
                         * @property {string|null} [recordSequence] DataChangeRecord recordSequence
                         * @property {string|null} [serverTransactionId] DataChangeRecord serverTransactionId
                         * @property {boolean|null} [isLastRecordInTransactionInPartition] DataChangeRecord isLastRecordInTransactionInPartition
                         * @property {string|null} [table] DataChangeRecord table
                         * @property {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata>|null} [columnMetadata] DataChangeRecord columnMetadata
                         * @property {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod>|null} [mods] DataChangeRecord mods
                         * @property {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType|null} [modType] DataChangeRecord modType
                         * @property {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType|null} [valueCaptureType] DataChangeRecord valueCaptureType
                         * @property {number|null} [numberOfRecordsInTransaction] DataChangeRecord numberOfRecordsInTransaction
                         * @property {number|null} [numberOfPartitionsInTransaction] DataChangeRecord numberOfPartitionsInTransaction
                         * @property {string|null} [transactionTag] DataChangeRecord transactionTag
                         * @property {boolean|null} [isSystemTransaction] DataChangeRecord isSystemTransaction
                         */
    
                        /**
                         * Constructs a new DataChangeRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @classdesc Represents a DataChangeRecord.
                         * @implements IDataChangeRecord
                         * @constructor
                         * @param {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord=} [properties] Properties to set
                         */
                        function DataChangeRecord(properties) {
                            this.columnMetadata = [];
                            this.mods = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * DataChangeRecord commitTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} commitTimestamp
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.commitTimestamp = null;
    
                        /**
                         * DataChangeRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.recordSequence = "";
    
                        /**
                         * DataChangeRecord serverTransactionId.
                         * @member {string} serverTransactionId
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.serverTransactionId = "";
    
                        /**
                         * DataChangeRecord isLastRecordInTransactionInPartition.
                         * @member {boolean} isLastRecordInTransactionInPartition
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.isLastRecordInTransactionInPartition = false;
    
                        /**
                         * DataChangeRecord table.
                         * @member {string} table
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.table = "";
    
                        /**
                         * DataChangeRecord columnMetadata.
                         * @member {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata>} columnMetadata
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.columnMetadata = $util.emptyArray;
    
                        /**
                         * DataChangeRecord mods.
                         * @member {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod>} mods
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.mods = $util.emptyArray;
    
                        /**
                         * DataChangeRecord modType.
                         * @member {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType} modType
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.modType = 0;
    
                        /**
                         * DataChangeRecord valueCaptureType.
                         * @member {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType} valueCaptureType
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.valueCaptureType = 0;
    
                        /**
                         * DataChangeRecord numberOfRecordsInTransaction.
                         * @member {number} numberOfRecordsInTransaction
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.numberOfRecordsInTransaction = 0;
    
                        /**
                         * DataChangeRecord numberOfPartitionsInTransaction.
                         * @member {number} numberOfPartitionsInTransaction
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.numberOfPartitionsInTransaction = 0;
    
                        /**
                         * DataChangeRecord transactionTag.
                         * @member {string} transactionTag
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.transactionTag = "";
    
                        /**
                         * DataChangeRecord isSystemTransaction.
                         * @member {boolean} isSystemTransaction
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         */
                        DataChangeRecord.prototype.isSystemTransaction = false;
    
                        /**
                         * Creates a new DataChangeRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord=} [properties] Properties to set
                         * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord} DataChangeRecord instance
                         */
                        DataChangeRecord.create = function create(properties) {
                            return new DataChangeRecord(properties);
                        };
    
                        /**
                         * Encodes the specified DataChangeRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord} message DataChangeRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DataChangeRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.commitTimestamp != null && Object.hasOwnProperty.call(message, "commitTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.commitTimestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.serverTransactionId != null && Object.hasOwnProperty.call(message, "serverTransactionId"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.serverTransactionId);
                            if (message.isLastRecordInTransactionInPartition != null && Object.hasOwnProperty.call(message, "isLastRecordInTransactionInPartition"))
                                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isLastRecordInTransactionInPartition);
                            if (message.table != null && Object.hasOwnProperty.call(message, "table"))
                                writer.uint32(/* id 5, wireType 2 =*/42).string(message.table);
                            if (message.columnMetadata != null && message.columnMetadata.length)
                                for (var i = 0; i < message.columnMetadata.length; ++i)
                                    $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.encode(message.columnMetadata[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                            if (message.mods != null && message.mods.length)
                                for (var i = 0; i < message.mods.length; ++i)
                                    $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.encode(message.mods[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                            if (message.modType != null && Object.hasOwnProperty.call(message, "modType"))
                                writer.uint32(/* id 8, wireType 0 =*/64).int32(message.modType);
                            if (message.valueCaptureType != null && Object.hasOwnProperty.call(message, "valueCaptureType"))
                                writer.uint32(/* id 9, wireType 0 =*/72).int32(message.valueCaptureType);
                            if (message.numberOfRecordsInTransaction != null && Object.hasOwnProperty.call(message, "numberOfRecordsInTransaction"))
                                writer.uint32(/* id 10, wireType 0 =*/80).int32(message.numberOfRecordsInTransaction);
                            if (message.numberOfPartitionsInTransaction != null && Object.hasOwnProperty.call(message, "numberOfPartitionsInTransaction"))
                                writer.uint32(/* id 11, wireType 0 =*/88).int32(message.numberOfPartitionsInTransaction);
                            if (message.transactionTag != null && Object.hasOwnProperty.call(message, "transactionTag"))
                                writer.uint32(/* id 12, wireType 2 =*/98).string(message.transactionTag);
                            if (message.isSystemTransaction != null && Object.hasOwnProperty.call(message, "isSystemTransaction"))
                                writer.uint32(/* id 13, wireType 0 =*/104).bool(message.isSystemTransaction);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified DataChangeRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IDataChangeRecord} message DataChangeRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        DataChangeRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a DataChangeRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord} DataChangeRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DataChangeRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.commitTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.serverTransactionId = reader.string();
                                        break;
                                    }
                                case 4: {
                                        message.isLastRecordInTransactionInPartition = reader.bool();
                                        break;
                                    }
                                case 5: {
                                        message.table = reader.string();
                                        break;
                                    }
                                case 6: {
                                        if (!(message.columnMetadata && message.columnMetadata.length))
                                            message.columnMetadata = [];
                                        message.columnMetadata.push($root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 7: {
                                        if (!(message.mods && message.mods.length))
                                            message.mods = [];
                                        message.mods.push($root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 8: {
                                        message.modType = reader.int32();
                                        break;
                                    }
                                case 9: {
                                        message.valueCaptureType = reader.int32();
                                        break;
                                    }
                                case 10: {
                                        message.numberOfRecordsInTransaction = reader.int32();
                                        break;
                                    }
                                case 11: {
                                        message.numberOfPartitionsInTransaction = reader.int32();
                                        break;
                                    }
                                case 12: {
                                        message.transactionTag = reader.string();
                                        break;
                                    }
                                case 13: {
                                        message.isSystemTransaction = reader.bool();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a DataChangeRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord} DataChangeRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        DataChangeRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a DataChangeRecord message.
                         * @function verify
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        DataChangeRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.commitTimestamp);
                                if (error)
                                    return "commitTimestamp." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.serverTransactionId != null && message.hasOwnProperty("serverTransactionId"))
                                if (!$util.isString(message.serverTransactionId))
                                    return "serverTransactionId: string expected";
                            if (message.isLastRecordInTransactionInPartition != null && message.hasOwnProperty("isLastRecordInTransactionInPartition"))
                                if (typeof message.isLastRecordInTransactionInPartition !== "boolean")
                                    return "isLastRecordInTransactionInPartition: boolean expected";
                            if (message.table != null && message.hasOwnProperty("table"))
                                if (!$util.isString(message.table))
                                    return "table: string expected";
                            if (message.columnMetadata != null && message.hasOwnProperty("columnMetadata")) {
                                if (!Array.isArray(message.columnMetadata))
                                    return "columnMetadata: array expected";
                                for (var i = 0; i < message.columnMetadata.length; ++i) {
                                    var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.verify(message.columnMetadata[i]);
                                    if (error)
                                        return "columnMetadata." + error;
                                }
                            }
                            if (message.mods != null && message.hasOwnProperty("mods")) {
                                if (!Array.isArray(message.mods))
                                    return "mods: array expected";
                                for (var i = 0; i < message.mods.length; ++i) {
                                    var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.verify(message.mods[i]);
                                    if (error)
                                        return "mods." + error;
                                }
                            }
                            if (message.modType != null && message.hasOwnProperty("modType"))
                                switch (message.modType) {
                                default:
                                    return "modType: enum value expected";
                                case 0:
                                case 10:
                                case 20:
                                case 30:
                                    break;
                                }
                            if (message.valueCaptureType != null && message.hasOwnProperty("valueCaptureType"))
                                switch (message.valueCaptureType) {
                                default:
                                    return "valueCaptureType: enum value expected";
                                case 0:
                                case 10:
                                case 20:
                                case 30:
                                case 40:
                                    break;
                                }
                            if (message.numberOfRecordsInTransaction != null && message.hasOwnProperty("numberOfRecordsInTransaction"))
                                if (!$util.isInteger(message.numberOfRecordsInTransaction))
                                    return "numberOfRecordsInTransaction: integer expected";
                            if (message.numberOfPartitionsInTransaction != null && message.hasOwnProperty("numberOfPartitionsInTransaction"))
                                if (!$util.isInteger(message.numberOfPartitionsInTransaction))
                                    return "numberOfPartitionsInTransaction: integer expected";
                            if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                                if (!$util.isString(message.transactionTag))
                                    return "transactionTag: string expected";
                            if (message.isSystemTransaction != null && message.hasOwnProperty("isSystemTransaction"))
                                if (typeof message.isSystemTransaction !== "boolean")
                                    return "isSystemTransaction: boolean expected";
                            return null;
                        };
    
                        /**
                         * Creates a DataChangeRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord} DataChangeRecord
                         */
                        DataChangeRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord)
                                return object;
                            var message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord();
                            if (object.commitTimestamp != null) {
                                if (typeof object.commitTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.commitTimestamp: object expected");
                                message.commitTimestamp = $root.google.protobuf.Timestamp.fromObject(object.commitTimestamp);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.serverTransactionId != null)
                                message.serverTransactionId = String(object.serverTransactionId);
                            if (object.isLastRecordInTransactionInPartition != null)
                                message.isLastRecordInTransactionInPartition = Boolean(object.isLastRecordInTransactionInPartition);
                            if (object.table != null)
                                message.table = String(object.table);
                            if (object.columnMetadata) {
                                if (!Array.isArray(object.columnMetadata))
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.columnMetadata: array expected");
                                message.columnMetadata = [];
                                for (var i = 0; i < object.columnMetadata.length; ++i) {
                                    if (typeof object.columnMetadata[i] !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.columnMetadata: object expected");
                                    message.columnMetadata[i] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.fromObject(object.columnMetadata[i]);
                                }
                            }
                            if (object.mods) {
                                if (!Array.isArray(object.mods))
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.mods: array expected");
                                message.mods = [];
                                for (var i = 0; i < object.mods.length; ++i) {
                                    if (typeof object.mods[i] !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.mods: object expected");
                                    message.mods[i] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.fromObject(object.mods[i]);
                                }
                            }
                            switch (object.modType) {
                            default:
                                if (typeof object.modType === "number") {
                                    message.modType = object.modType;
                                    break;
                                }
                                break;
                            case "MOD_TYPE_UNSPECIFIED":
                            case 0:
                                message.modType = 0;
                                break;
                            case "INSERT":
                            case 10:
                                message.modType = 10;
                                break;
                            case "UPDATE":
                            case 20:
                                message.modType = 20;
                                break;
                            case "DELETE":
                            case 30:
                                message.modType = 30;
                                break;
                            }
                            switch (object.valueCaptureType) {
                            default:
                                if (typeof object.valueCaptureType === "number") {
                                    message.valueCaptureType = object.valueCaptureType;
                                    break;
                                }
                                break;
                            case "VALUE_CAPTURE_TYPE_UNSPECIFIED":
                            case 0:
                                message.valueCaptureType = 0;
                                break;
                            case "OLD_AND_NEW_VALUES":
                            case 10:
                                message.valueCaptureType = 10;
                                break;
                            case "NEW_VALUES":
                            case 20:
                                message.valueCaptureType = 20;
                                break;
                            case "NEW_ROW":
                            case 30:
                                message.valueCaptureType = 30;
                                break;
                            case "NEW_ROW_AND_OLD_VALUES":
                            case 40:
                                message.valueCaptureType = 40;
                                break;
                            }
                            if (object.numberOfRecordsInTransaction != null)
                                message.numberOfRecordsInTransaction = object.numberOfRecordsInTransaction | 0;
                            if (object.numberOfPartitionsInTransaction != null)
                                message.numberOfPartitionsInTransaction = object.numberOfPartitionsInTransaction | 0;
                            if (object.transactionTag != null)
                                message.transactionTag = String(object.transactionTag);
                            if (object.isSystemTransaction != null)
                                message.isSystemTransaction = Boolean(object.isSystemTransaction);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a DataChangeRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord} message DataChangeRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        DataChangeRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.columnMetadata = [];
                                object.mods = [];
                            }
                            if (options.defaults) {
                                object.commitTimestamp = null;
                                object.recordSequence = "";
                                object.serverTransactionId = "";
                                object.isLastRecordInTransactionInPartition = false;
                                object.table = "";
                                object.modType = options.enums === String ? "MOD_TYPE_UNSPECIFIED" : 0;
                                object.valueCaptureType = options.enums === String ? "VALUE_CAPTURE_TYPE_UNSPECIFIED" : 0;
                                object.numberOfRecordsInTransaction = 0;
                                object.numberOfPartitionsInTransaction = 0;
                                object.transactionTag = "";
                                object.isSystemTransaction = false;
                            }
                            if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp"))
                                object.commitTimestamp = $root.google.protobuf.Timestamp.toObject(message.commitTimestamp, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.serverTransactionId != null && message.hasOwnProperty("serverTransactionId"))
                                object.serverTransactionId = message.serverTransactionId;
                            if (message.isLastRecordInTransactionInPartition != null && message.hasOwnProperty("isLastRecordInTransactionInPartition"))
                                object.isLastRecordInTransactionInPartition = message.isLastRecordInTransactionInPartition;
                            if (message.table != null && message.hasOwnProperty("table"))
                                object.table = message.table;
                            if (message.columnMetadata && message.columnMetadata.length) {
                                object.columnMetadata = [];
                                for (var j = 0; j < message.columnMetadata.length; ++j)
                                    object.columnMetadata[j] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.toObject(message.columnMetadata[j], options);
                            }
                            if (message.mods && message.mods.length) {
                                object.mods = [];
                                for (var j = 0; j < message.mods.length; ++j)
                                    object.mods[j] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.toObject(message.mods[j], options);
                            }
                            if (message.modType != null && message.hasOwnProperty("modType"))
                                object.modType = options.enums === String ? $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType[message.modType] === undefined ? message.modType : $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType[message.modType] : message.modType;
                            if (message.valueCaptureType != null && message.hasOwnProperty("valueCaptureType"))
                                object.valueCaptureType = options.enums === String ? $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType[message.valueCaptureType] === undefined ? message.valueCaptureType : $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType[message.valueCaptureType] : message.valueCaptureType;
                            if (message.numberOfRecordsInTransaction != null && message.hasOwnProperty("numberOfRecordsInTransaction"))
                                object.numberOfRecordsInTransaction = message.numberOfRecordsInTransaction;
                            if (message.numberOfPartitionsInTransaction != null && message.hasOwnProperty("numberOfPartitionsInTransaction"))
                                object.numberOfPartitionsInTransaction = message.numberOfPartitionsInTransaction;
                            if (message.transactionTag != null && message.hasOwnProperty("transactionTag"))
                                object.transactionTag = message.transactionTag;
                            if (message.isSystemTransaction != null && message.hasOwnProperty("isSystemTransaction"))
                                object.isSystemTransaction = message.isSystemTransaction;
                            return object;
                        };
    
                        /**
                         * Converts this DataChangeRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        DataChangeRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for DataChangeRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        DataChangeRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.DataChangeRecord";
                        };
    
                        DataChangeRecord.ColumnMetadata = (function() {
    
                            /**
                             * Properties of a ColumnMetadata.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @interface IColumnMetadata
                             * @property {string|null} [name] ColumnMetadata name
                             * @property {google.spanner.v1.IType|null} [type] ColumnMetadata type
                             * @property {boolean|null} [isPrimaryKey] ColumnMetadata isPrimaryKey
                             * @property {number|Long|null} [ordinalPosition] ColumnMetadata ordinalPosition
                             */
    
                            /**
                             * Constructs a new ColumnMetadata.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @classdesc Represents a ColumnMetadata.
                             * @implements IColumnMetadata
                             * @constructor
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata=} [properties] Properties to set
                             */
                            function ColumnMetadata(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ColumnMetadata name.
                             * @member {string} name
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @instance
                             */
                            ColumnMetadata.prototype.name = "";
    
                            /**
                             * ColumnMetadata type.
                             * @member {google.spanner.v1.IType|null|undefined} type
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @instance
                             */
                            ColumnMetadata.prototype.type = null;
    
                            /**
                             * ColumnMetadata isPrimaryKey.
                             * @member {boolean} isPrimaryKey
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @instance
                             */
                            ColumnMetadata.prototype.isPrimaryKey = false;
    
                            /**
                             * ColumnMetadata ordinalPosition.
                             * @member {number|Long} ordinalPosition
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @instance
                             */
                            ColumnMetadata.prototype.ordinalPosition = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                            /**
                             * Creates a new ColumnMetadata instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata=} [properties] Properties to set
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata} ColumnMetadata instance
                             */
                            ColumnMetadata.create = function create(properties) {
                                return new ColumnMetadata(properties);
                            };
    
                            /**
                             * Encodes the specified ColumnMetadata message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata} message ColumnMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ColumnMetadata.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                                if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                                    $root.google.spanner.v1.Type.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.isPrimaryKey != null && Object.hasOwnProperty.call(message, "isPrimaryKey"))
                                    writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isPrimaryKey);
                                if (message.ordinalPosition != null && Object.hasOwnProperty.call(message, "ordinalPosition"))
                                    writer.uint32(/* id 4, wireType 0 =*/32).int64(message.ordinalPosition);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ColumnMetadata message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IColumnMetadata} message ColumnMetadata message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ColumnMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ColumnMetadata message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata} ColumnMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ColumnMetadata.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.name = reader.string();
                                            break;
                                        }
                                    case 2: {
                                            message.type = $root.google.spanner.v1.Type.decode(reader, reader.uint32());
                                            break;
                                        }
                                    case 3: {
                                            message.isPrimaryKey = reader.bool();
                                            break;
                                        }
                                    case 4: {
                                            message.ordinalPosition = reader.int64();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ColumnMetadata message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata} ColumnMetadata
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ColumnMetadata.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ColumnMetadata message.
                             * @function verify
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ColumnMetadata.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.name != null && message.hasOwnProperty("name"))
                                    if (!$util.isString(message.name))
                                        return "name: string expected";
                                if (message.type != null && message.hasOwnProperty("type")) {
                                    var error = $root.google.spanner.v1.Type.verify(message.type);
                                    if (error)
                                        return "type." + error;
                                }
                                if (message.isPrimaryKey != null && message.hasOwnProperty("isPrimaryKey"))
                                    if (typeof message.isPrimaryKey !== "boolean")
                                        return "isPrimaryKey: boolean expected";
                                if (message.ordinalPosition != null && message.hasOwnProperty("ordinalPosition"))
                                    if (!$util.isInteger(message.ordinalPosition) && !(message.ordinalPosition && $util.isInteger(message.ordinalPosition.low) && $util.isInteger(message.ordinalPosition.high)))
                                        return "ordinalPosition: integer|Long expected";
                                return null;
                            };
    
                            /**
                             * Creates a ColumnMetadata message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata} ColumnMetadata
                             */
                            ColumnMetadata.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata)
                                    return object;
                                var message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata();
                                if (object.name != null)
                                    message.name = String(object.name);
                                if (object.type != null) {
                                    if (typeof object.type !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata.type: object expected");
                                    message.type = $root.google.spanner.v1.Type.fromObject(object.type);
                                }
                                if (object.isPrimaryKey != null)
                                    message.isPrimaryKey = Boolean(object.isPrimaryKey);
                                if (object.ordinalPosition != null)
                                    if ($util.Long)
                                        (message.ordinalPosition = $util.Long.fromValue(object.ordinalPosition)).unsigned = false;
                                    else if (typeof object.ordinalPosition === "string")
                                        message.ordinalPosition = parseInt(object.ordinalPosition, 10);
                                    else if (typeof object.ordinalPosition === "number")
                                        message.ordinalPosition = object.ordinalPosition;
                                    else if (typeof object.ordinalPosition === "object")
                                        message.ordinalPosition = new $util.LongBits(object.ordinalPosition.low >>> 0, object.ordinalPosition.high >>> 0).toNumber();
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ColumnMetadata message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata} message ColumnMetadata
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ColumnMetadata.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.name = "";
                                    object.type = null;
                                    object.isPrimaryKey = false;
                                    if ($util.Long) {
                                        var long = new $util.Long(0, 0, false);
                                        object.ordinalPosition = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                                    } else
                                        object.ordinalPosition = options.longs === String ? "0" : 0;
                                }
                                if (message.name != null && message.hasOwnProperty("name"))
                                    object.name = message.name;
                                if (message.type != null && message.hasOwnProperty("type"))
                                    object.type = $root.google.spanner.v1.Type.toObject(message.type, options);
                                if (message.isPrimaryKey != null && message.hasOwnProperty("isPrimaryKey"))
                                    object.isPrimaryKey = message.isPrimaryKey;
                                if (message.ordinalPosition != null && message.hasOwnProperty("ordinalPosition"))
                                    if (typeof message.ordinalPosition === "number")
                                        object.ordinalPosition = options.longs === String ? String(message.ordinalPosition) : message.ordinalPosition;
                                    else
                                        object.ordinalPosition = options.longs === String ? $util.Long.prototype.toString.call(message.ordinalPosition) : options.longs === Number ? new $util.LongBits(message.ordinalPosition.low >>> 0, message.ordinalPosition.high >>> 0).toNumber() : message.ordinalPosition;
                                return object;
                            };
    
                            /**
                             * Converts this ColumnMetadata to JSON.
                             * @function toJSON
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ColumnMetadata.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ColumnMetadata
                             * @function getTypeUrl
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ColumnMetadata.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ColumnMetadata";
                            };
    
                            return ColumnMetadata;
                        })();
    
                        DataChangeRecord.ModValue = (function() {
    
                            /**
                             * Properties of a ModValue.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @interface IModValue
                             * @property {number|null} [columnMetadataIndex] ModValue columnMetadataIndex
                             * @property {google.protobuf.IValue|null} [value] ModValue value
                             */
    
                            /**
                             * Constructs a new ModValue.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @classdesc Represents a ModValue.
                             * @implements IModValue
                             * @constructor
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue=} [properties] Properties to set
                             */
                            function ModValue(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * ModValue columnMetadataIndex.
                             * @member {number} columnMetadataIndex
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @instance
                             */
                            ModValue.prototype.columnMetadataIndex = 0;
    
                            /**
                             * ModValue value.
                             * @member {google.protobuf.IValue|null|undefined} value
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @instance
                             */
                            ModValue.prototype.value = null;
    
                            /**
                             * Creates a new ModValue instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue=} [properties] Properties to set
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue} ModValue instance
                             */
                            ModValue.create = function create(properties) {
                                return new ModValue(properties);
                            };
    
                            /**
                             * Encodes the specified ModValue message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue} message ModValue message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ModValue.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.columnMetadataIndex != null && Object.hasOwnProperty.call(message, "columnMetadataIndex"))
                                    writer.uint32(/* id 1, wireType 0 =*/8).int32(message.columnMetadataIndex);
                                if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                                    $root.google.protobuf.Value.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified ModValue message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue} message ModValue message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            ModValue.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a ModValue message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue} ModValue
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ModValue.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.columnMetadataIndex = reader.int32();
                                            break;
                                        }
                                    case 2: {
                                            message.value = $root.google.protobuf.Value.decode(reader, reader.uint32());
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a ModValue message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue} ModValue
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            ModValue.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a ModValue message.
                             * @function verify
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            ModValue.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.columnMetadataIndex != null && message.hasOwnProperty("columnMetadataIndex"))
                                    if (!$util.isInteger(message.columnMetadataIndex))
                                        return "columnMetadataIndex: integer expected";
                                if (message.value != null && message.hasOwnProperty("value")) {
                                    var error = $root.google.protobuf.Value.verify(message.value);
                                    if (error)
                                        return "value." + error;
                                }
                                return null;
                            };
    
                            /**
                             * Creates a ModValue message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue} ModValue
                             */
                            ModValue.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue)
                                    return object;
                                var message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue();
                                if (object.columnMetadataIndex != null)
                                    message.columnMetadataIndex = object.columnMetadataIndex | 0;
                                if (object.value != null) {
                                    if (typeof object.value !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.value: object expected");
                                    message.value = $root.google.protobuf.Value.fromObject(object.value);
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a ModValue message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue} message ModValue
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            ModValue.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults) {
                                    object.columnMetadataIndex = 0;
                                    object.value = null;
                                }
                                if (message.columnMetadataIndex != null && message.hasOwnProperty("columnMetadataIndex"))
                                    object.columnMetadataIndex = message.columnMetadataIndex;
                                if (message.value != null && message.hasOwnProperty("value"))
                                    object.value = $root.google.protobuf.Value.toObject(message.value, options);
                                return object;
                            };
    
                            /**
                             * Converts this ModValue to JSON.
                             * @function toJSON
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            ModValue.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for ModValue
                             * @function getTypeUrl
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            ModValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue";
                            };
    
                            return ModValue;
                        })();
    
                        DataChangeRecord.Mod = (function() {
    
                            /**
                             * Properties of a Mod.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @interface IMod
                             * @property {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>|null} [keys] Mod keys
                             * @property {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>|null} [oldValues] Mod oldValues
                             * @property {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>|null} [newValues] Mod newValues
                             */
    
                            /**
                             * Constructs a new Mod.
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord
                             * @classdesc Represents a Mod.
                             * @implements IMod
                             * @constructor
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod=} [properties] Properties to set
                             */
                            function Mod(properties) {
                                this.keys = [];
                                this.oldValues = [];
                                this.newValues = [];
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * Mod keys.
                             * @member {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>} keys
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.keys = $util.emptyArray;
    
                            /**
                             * Mod oldValues.
                             * @member {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>} oldValues
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.oldValues = $util.emptyArray;
    
                            /**
                             * Mod newValues.
                             * @member {Array.<google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IModValue>} newValues
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @instance
                             */
                            Mod.prototype.newValues = $util.emptyArray;
    
                            /**
                             * Creates a new Mod instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod=} [properties] Properties to set
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod} Mod instance
                             */
                            Mod.create = function create(properties) {
                                return new Mod(properties);
                            };
    
                            /**
                             * Encodes the specified Mod message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.keys != null && message.keys.length)
                                    for (var i = 0; i < message.keys.length; ++i)
                                        $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.encode(message.keys[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                                if (message.oldValues != null && message.oldValues.length)
                                    for (var i = 0; i < message.oldValues.length; ++i)
                                        $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.encode(message.oldValues[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                                if (message.newValues != null && message.newValues.length)
                                    for (var i = 0; i < message.newValues.length; ++i)
                                        $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.encode(message.newValues[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                                return writer;
                            };
    
                            /**
                             * Encodes the specified Mod message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.IMod} message Mod message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            Mod.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            if (!(message.keys && message.keys.length))
                                                message.keys = [];
                                            message.keys.push($root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 2: {
                                            if (!(message.oldValues && message.oldValues.length))
                                                message.oldValues = [];
                                            message.oldValues.push($root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    case 3: {
                                            if (!(message.newValues && message.newValues.length))
                                                message.newValues = [];
                                            message.newValues.push($root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.decode(reader, reader.uint32()));
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a Mod message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod} Mod
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            Mod.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a Mod message.
                             * @function verify
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            Mod.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.keys != null && message.hasOwnProperty("keys")) {
                                    if (!Array.isArray(message.keys))
                                        return "keys: array expected";
                                    for (var i = 0; i < message.keys.length; ++i) {
                                        var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.verify(message.keys[i]);
                                        if (error)
                                            return "keys." + error;
                                    }
                                }
                                if (message.oldValues != null && message.hasOwnProperty("oldValues")) {
                                    if (!Array.isArray(message.oldValues))
                                        return "oldValues: array expected";
                                    for (var i = 0; i < message.oldValues.length; ++i) {
                                        var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.verify(message.oldValues[i]);
                                        if (error)
                                            return "oldValues." + error;
                                    }
                                }
                                if (message.newValues != null && message.hasOwnProperty("newValues")) {
                                    if (!Array.isArray(message.newValues))
                                        return "newValues: array expected";
                                    for (var i = 0; i < message.newValues.length; ++i) {
                                        var error = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.verify(message.newValues[i]);
                                        if (error)
                                            return "newValues." + error;
                                    }
                                }
                                return null;
                            };
    
                            /**
                             * Creates a Mod message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod} Mod
                             */
                            Mod.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod)
                                    return object;
                                var message = new $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod();
                                if (object.keys) {
                                    if (!Array.isArray(object.keys))
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.keys: array expected");
                                    message.keys = [];
                                    for (var i = 0; i < object.keys.length; ++i) {
                                        if (typeof object.keys[i] !== "object")
                                            throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.keys: object expected");
                                        message.keys[i] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.fromObject(object.keys[i]);
                                    }
                                }
                                if (object.oldValues) {
                                    if (!Array.isArray(object.oldValues))
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.oldValues: array expected");
                                    message.oldValues = [];
                                    for (var i = 0; i < object.oldValues.length; ++i) {
                                        if (typeof object.oldValues[i] !== "object")
                                            throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.oldValues: object expected");
                                        message.oldValues[i] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.fromObject(object.oldValues[i]);
                                    }
                                }
                                if (object.newValues) {
                                    if (!Array.isArray(object.newValues))
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.newValues: array expected");
                                    message.newValues = [];
                                    for (var i = 0; i < object.newValues.length; ++i) {
                                        if (typeof object.newValues[i] !== "object")
                                            throw TypeError(".google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod.newValues: object expected");
                                        message.newValues[i] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.fromObject(object.newValues[i]);
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a Mod message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod} message Mod
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            Mod.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.arrays || options.defaults) {
                                    object.keys = [];
                                    object.oldValues = [];
                                    object.newValues = [];
                                }
                                if (message.keys && message.keys.length) {
                                    object.keys = [];
                                    for (var j = 0; j < message.keys.length; ++j)
                                        object.keys[j] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.toObject(message.keys[j], options);
                                }
                                if (message.oldValues && message.oldValues.length) {
                                    object.oldValues = [];
                                    for (var j = 0; j < message.oldValues.length; ++j)
                                        object.oldValues[j] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.toObject(message.oldValues[j], options);
                                }
                                if (message.newValues && message.newValues.length) {
                                    object.newValues = [];
                                    for (var j = 0; j < message.newValues.length; ++j)
                                        object.newValues[j] = $root.google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModValue.toObject(message.newValues[j], options);
                                }
                                return object;
                            };
    
                            /**
                             * Converts this Mod to JSON.
                             * @function toJSON
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            Mod.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for Mod
                             * @function getTypeUrl
                             * @memberof google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            Mod.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.DataChangeRecord.Mod";
                            };
    
                            return Mod;
                        })();
    
                        /**
                         * ModType enum.
                         * @name google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ModType
                         * @enum {number}
                         * @property {number} MOD_TYPE_UNSPECIFIED=0 MOD_TYPE_UNSPECIFIED value
                         * @property {number} INSERT=10 INSERT value
                         * @property {number} UPDATE=20 UPDATE value
                         * @property {number} DELETE=30 DELETE value
                         */
                        DataChangeRecord.ModType = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "MOD_TYPE_UNSPECIFIED"] = 0;
                            values[valuesById[10] = "INSERT"] = 10;
                            values[valuesById[20] = "UPDATE"] = 20;
                            values[valuesById[30] = "DELETE"] = 30;
                            return values;
                        })();
    
                        /**
                         * ValueCaptureType enum.
                         * @name google.spanner.v1.ChangeStreamRecord.DataChangeRecord.ValueCaptureType
                         * @enum {number}
                         * @property {number} VALUE_CAPTURE_TYPE_UNSPECIFIED=0 VALUE_CAPTURE_TYPE_UNSPECIFIED value
                         * @property {number} OLD_AND_NEW_VALUES=10 OLD_AND_NEW_VALUES value
                         * @property {number} NEW_VALUES=20 NEW_VALUES value
                         * @property {number} NEW_ROW=30 NEW_ROW value
                         * @property {number} NEW_ROW_AND_OLD_VALUES=40 NEW_ROW_AND_OLD_VALUES value
                         */
                        DataChangeRecord.ValueCaptureType = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "VALUE_CAPTURE_TYPE_UNSPECIFIED"] = 0;
                            values[valuesById[10] = "OLD_AND_NEW_VALUES"] = 10;
                            values[valuesById[20] = "NEW_VALUES"] = 20;
                            values[valuesById[30] = "NEW_ROW"] = 30;
                            values[valuesById[40] = "NEW_ROW_AND_OLD_VALUES"] = 40;
                            return values;
                        })();
    
                        return DataChangeRecord;
                    })();
    
                    ChangeStreamRecord.HeartbeatRecord = (function() {
    
                        /**
                         * Properties of a HeartbeatRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @interface IHeartbeatRecord
                         * @property {google.protobuf.ITimestamp|null} [timestamp] HeartbeatRecord timestamp
                         */
    
                        /**
                         * Constructs a new HeartbeatRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @classdesc Represents a HeartbeatRecord.
                         * @implements IHeartbeatRecord
                         * @constructor
                         * @param {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord=} [properties] Properties to set
                         */
                        function HeartbeatRecord(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * HeartbeatRecord timestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} timestamp
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @instance
                         */
                        HeartbeatRecord.prototype.timestamp = null;
    
                        /**
                         * Creates a new HeartbeatRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord=} [properties] Properties to set
                         * @returns {google.spanner.v1.ChangeStreamRecord.HeartbeatRecord} HeartbeatRecord instance
                         */
                        HeartbeatRecord.create = function create(properties) {
                            return new HeartbeatRecord(properties);
                        };
    
                        /**
                         * Encodes the specified HeartbeatRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord} message HeartbeatRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        HeartbeatRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                                $root.google.protobuf.Timestamp.encode(message.timestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified HeartbeatRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IHeartbeatRecord} message HeartbeatRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        HeartbeatRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a HeartbeatRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ChangeStreamRecord.HeartbeatRecord} HeartbeatRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        HeartbeatRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.timestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a HeartbeatRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ChangeStreamRecord.HeartbeatRecord} HeartbeatRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        HeartbeatRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a HeartbeatRecord message.
                         * @function verify
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        HeartbeatRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.timestamp != null && message.hasOwnProperty("timestamp")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.timestamp);
                                if (error)
                                    return "timestamp." + error;
                            }
                            return null;
                        };
    
                        /**
                         * Creates a HeartbeatRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ChangeStreamRecord.HeartbeatRecord} HeartbeatRecord
                         */
                        HeartbeatRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord)
                                return object;
                            var message = new $root.google.spanner.v1.ChangeStreamRecord.HeartbeatRecord();
                            if (object.timestamp != null) {
                                if (typeof object.timestamp !== "object")
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.HeartbeatRecord.timestamp: object expected");
                                message.timestamp = $root.google.protobuf.Timestamp.fromObject(object.timestamp);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a HeartbeatRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.HeartbeatRecord} message HeartbeatRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        HeartbeatRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults)
                                object.timestamp = null;
                            if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                                object.timestamp = $root.google.protobuf.Timestamp.toObject(message.timestamp, options);
                            return object;
                        };
    
                        /**
                         * Converts this HeartbeatRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        HeartbeatRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for HeartbeatRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ChangeStreamRecord.HeartbeatRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        HeartbeatRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.HeartbeatRecord";
                        };
    
                        return HeartbeatRecord;
                    })();
    
                    ChangeStreamRecord.PartitionStartRecord = (function() {
    
                        /**
                         * Properties of a PartitionStartRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @interface IPartitionStartRecord
                         * @property {google.protobuf.ITimestamp|null} [startTimestamp] PartitionStartRecord startTimestamp
                         * @property {string|null} [recordSequence] PartitionStartRecord recordSequence
                         * @property {Array.<string>|null} [partitionTokens] PartitionStartRecord partitionTokens
                         */
    
                        /**
                         * Constructs a new PartitionStartRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @classdesc Represents a PartitionStartRecord.
                         * @implements IPartitionStartRecord
                         * @constructor
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord=} [properties] Properties to set
                         */
                        function PartitionStartRecord(properties) {
                            this.partitionTokens = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * PartitionStartRecord startTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} startTimestamp
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @instance
                         */
                        PartitionStartRecord.prototype.startTimestamp = null;
    
                        /**
                         * PartitionStartRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @instance
                         */
                        PartitionStartRecord.prototype.recordSequence = "";
    
                        /**
                         * PartitionStartRecord partitionTokens.
                         * @member {Array.<string>} partitionTokens
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @instance
                         */
                        PartitionStartRecord.prototype.partitionTokens = $util.emptyArray;
    
                        /**
                         * Creates a new PartitionStartRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord=} [properties] Properties to set
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionStartRecord} PartitionStartRecord instance
                         */
                        PartitionStartRecord.create = function create(properties) {
                            return new PartitionStartRecord(properties);
                        };
    
                        /**
                         * Encodes the specified PartitionStartRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord} message PartitionStartRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionStartRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.startTimestamp != null && Object.hasOwnProperty.call(message, "startTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.startTimestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.partitionTokens != null && message.partitionTokens.length)
                                for (var i = 0; i < message.partitionTokens.length; ++i)
                                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.partitionTokens[i]);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified PartitionStartRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionStartRecord} message PartitionStartRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionStartRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a PartitionStartRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionStartRecord} PartitionStartRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionStartRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.startTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        if (!(message.partitionTokens && message.partitionTokens.length))
                                            message.partitionTokens = [];
                                        message.partitionTokens.push(reader.string());
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a PartitionStartRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionStartRecord} PartitionStartRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionStartRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a PartitionStartRecord message.
                         * @function verify
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        PartitionStartRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.startTimestamp != null && message.hasOwnProperty("startTimestamp")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.startTimestamp);
                                if (error)
                                    return "startTimestamp." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.partitionTokens != null && message.hasOwnProperty("partitionTokens")) {
                                if (!Array.isArray(message.partitionTokens))
                                    return "partitionTokens: array expected";
                                for (var i = 0; i < message.partitionTokens.length; ++i)
                                    if (!$util.isString(message.partitionTokens[i]))
                                        return "partitionTokens: string[] expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates a PartitionStartRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionStartRecord} PartitionStartRecord
                         */
                        PartitionStartRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord)
                                return object;
                            var message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionStartRecord();
                            if (object.startTimestamp != null) {
                                if (typeof object.startTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.startTimestamp: object expected");
                                message.startTimestamp = $root.google.protobuf.Timestamp.fromObject(object.startTimestamp);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.partitionTokens) {
                                if (!Array.isArray(object.partitionTokens))
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionStartRecord.partitionTokens: array expected");
                                message.partitionTokens = [];
                                for (var i = 0; i < object.partitionTokens.length; ++i)
                                    message.partitionTokens[i] = String(object.partitionTokens[i]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a PartitionStartRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.PartitionStartRecord} message PartitionStartRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        PartitionStartRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.partitionTokens = [];
                            if (options.defaults) {
                                object.startTimestamp = null;
                                object.recordSequence = "";
                            }
                            if (message.startTimestamp != null && message.hasOwnProperty("startTimestamp"))
                                object.startTimestamp = $root.google.protobuf.Timestamp.toObject(message.startTimestamp, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.partitionTokens && message.partitionTokens.length) {
                                object.partitionTokens = [];
                                for (var j = 0; j < message.partitionTokens.length; ++j)
                                    object.partitionTokens[j] = message.partitionTokens[j];
                            }
                            return object;
                        };
    
                        /**
                         * Converts this PartitionStartRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        PartitionStartRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for PartitionStartRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionStartRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        PartitionStartRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.PartitionStartRecord";
                        };
    
                        return PartitionStartRecord;
                    })();
    
                    ChangeStreamRecord.PartitionEndRecord = (function() {
    
                        /**
                         * Properties of a PartitionEndRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @interface IPartitionEndRecord
                         * @property {google.protobuf.ITimestamp|null} [endTimestamp] PartitionEndRecord endTimestamp
                         * @property {string|null} [recordSequence] PartitionEndRecord recordSequence
                         * @property {string|null} [partitionToken] PartitionEndRecord partitionToken
                         */
    
                        /**
                         * Constructs a new PartitionEndRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @classdesc Represents a PartitionEndRecord.
                         * @implements IPartitionEndRecord
                         * @constructor
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord=} [properties] Properties to set
                         */
                        function PartitionEndRecord(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * PartitionEndRecord endTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} endTimestamp
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @instance
                         */
                        PartitionEndRecord.prototype.endTimestamp = null;
    
                        /**
                         * PartitionEndRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @instance
                         */
                        PartitionEndRecord.prototype.recordSequence = "";
    
                        /**
                         * PartitionEndRecord partitionToken.
                         * @member {string} partitionToken
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @instance
                         */
                        PartitionEndRecord.prototype.partitionToken = "";
    
                        /**
                         * Creates a new PartitionEndRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord=} [properties] Properties to set
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEndRecord} PartitionEndRecord instance
                         */
                        PartitionEndRecord.create = function create(properties) {
                            return new PartitionEndRecord(properties);
                        };
    
                        /**
                         * Encodes the specified PartitionEndRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord} message PartitionEndRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionEndRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.endTimestamp != null && Object.hasOwnProperty.call(message, "endTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.endTimestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.partitionToken);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified PartitionEndRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEndRecord} message PartitionEndRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionEndRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a PartitionEndRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEndRecord} PartitionEndRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionEndRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.endTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.partitionToken = reader.string();
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a PartitionEndRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEndRecord} PartitionEndRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionEndRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a PartitionEndRecord message.
                         * @function verify
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        PartitionEndRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.endTimestamp != null && message.hasOwnProperty("endTimestamp")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.endTimestamp);
                                if (error)
                                    return "endTimestamp." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                if (!$util.isString(message.partitionToken))
                                    return "partitionToken: string expected";
                            return null;
                        };
    
                        /**
                         * Creates a PartitionEndRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEndRecord} PartitionEndRecord
                         */
                        PartitionEndRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord)
                                return object;
                            var message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEndRecord();
                            if (object.endTimestamp != null) {
                                if (typeof object.endTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEndRecord.endTimestamp: object expected");
                                message.endTimestamp = $root.google.protobuf.Timestamp.fromObject(object.endTimestamp);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.partitionToken != null)
                                message.partitionToken = String(object.partitionToken);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a PartitionEndRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.PartitionEndRecord} message PartitionEndRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        PartitionEndRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.endTimestamp = null;
                                object.recordSequence = "";
                                object.partitionToken = "";
                            }
                            if (message.endTimestamp != null && message.hasOwnProperty("endTimestamp"))
                                object.endTimestamp = $root.google.protobuf.Timestamp.toObject(message.endTimestamp, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                object.partitionToken = message.partitionToken;
                            return object;
                        };
    
                        /**
                         * Converts this PartitionEndRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        PartitionEndRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for PartitionEndRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEndRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        PartitionEndRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.PartitionEndRecord";
                        };
    
                        return PartitionEndRecord;
                    })();
    
                    ChangeStreamRecord.PartitionEventRecord = (function() {
    
                        /**
                         * Properties of a PartitionEventRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @interface IPartitionEventRecord
                         * @property {google.protobuf.ITimestamp|null} [commitTimestamp] PartitionEventRecord commitTimestamp
                         * @property {string|null} [recordSequence] PartitionEventRecord recordSequence
                         * @property {string|null} [partitionToken] PartitionEventRecord partitionToken
                         * @property {Array.<google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent>|null} [moveInEvents] PartitionEventRecord moveInEvents
                         * @property {Array.<google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent>|null} [moveOutEvents] PartitionEventRecord moveOutEvents
                         */
    
                        /**
                         * Constructs a new PartitionEventRecord.
                         * @memberof google.spanner.v1.ChangeStreamRecord
                         * @classdesc Represents a PartitionEventRecord.
                         * @implements IPartitionEventRecord
                         * @constructor
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord=} [properties] Properties to set
                         */
                        function PartitionEventRecord(properties) {
                            this.moveInEvents = [];
                            this.moveOutEvents = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * PartitionEventRecord commitTimestamp.
                         * @member {google.protobuf.ITimestamp|null|undefined} commitTimestamp
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         */
                        PartitionEventRecord.prototype.commitTimestamp = null;
    
                        /**
                         * PartitionEventRecord recordSequence.
                         * @member {string} recordSequence
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         */
                        PartitionEventRecord.prototype.recordSequence = "";
    
                        /**
                         * PartitionEventRecord partitionToken.
                         * @member {string} partitionToken
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         */
                        PartitionEventRecord.prototype.partitionToken = "";
    
                        /**
                         * PartitionEventRecord moveInEvents.
                         * @member {Array.<google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent>} moveInEvents
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         */
                        PartitionEventRecord.prototype.moveInEvents = $util.emptyArray;
    
                        /**
                         * PartitionEventRecord moveOutEvents.
                         * @member {Array.<google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent>} moveOutEvents
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         */
                        PartitionEventRecord.prototype.moveOutEvents = $util.emptyArray;
    
                        /**
                         * Creates a new PartitionEventRecord instance using the specified properties.
                         * @function create
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord=} [properties] Properties to set
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord} PartitionEventRecord instance
                         */
                        PartitionEventRecord.create = function create(properties) {
                            return new PartitionEventRecord(properties);
                        };
    
                        /**
                         * Encodes the specified PartitionEventRecord message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.verify|verify} messages.
                         * @function encode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord} message PartitionEventRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionEventRecord.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.commitTimestamp != null && Object.hasOwnProperty.call(message, "commitTimestamp"))
                                $root.google.protobuf.Timestamp.encode(message.commitTimestamp, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                            if (message.recordSequence != null && Object.hasOwnProperty.call(message, "recordSequence"))
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.recordSequence);
                            if (message.partitionToken != null && Object.hasOwnProperty.call(message, "partitionToken"))
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.partitionToken);
                            if (message.moveInEvents != null && message.moveInEvents.length)
                                for (var i = 0; i < message.moveInEvents.length; ++i)
                                    $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.encode(message.moveInEvents[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                            if (message.moveOutEvents != null && message.moveOutEvents.length)
                                for (var i = 0; i < message.moveOutEvents.length; ++i)
                                    $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.encode(message.moveOutEvents[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                            return writer;
                        };
    
                        /**
                         * Encodes the specified PartitionEventRecord message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.IPartitionEventRecord} message PartitionEventRecord message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        PartitionEventRecord.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a PartitionEventRecord message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord} PartitionEventRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionEventRecord.decode = function decode(reader, length, error) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                if (tag === error)
                                    break;
                                switch (tag >>> 3) {
                                case 1: {
                                        message.commitTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                        break;
                                    }
                                case 2: {
                                        message.recordSequence = reader.string();
                                        break;
                                    }
                                case 3: {
                                        message.partitionToken = reader.string();
                                        break;
                                    }
                                case 4: {
                                        if (!(message.moveInEvents && message.moveInEvents.length))
                                            message.moveInEvents = [];
                                        message.moveInEvents.push($root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.decode(reader, reader.uint32()));
                                        break;
                                    }
                                case 5: {
                                        if (!(message.moveOutEvents && message.moveOutEvents.length))
                                            message.moveOutEvents = [];
                                        message.moveOutEvents.push($root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.decode(reader, reader.uint32()));
                                        break;
                                    }
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a PartitionEventRecord message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord} PartitionEventRecord
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        PartitionEventRecord.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a PartitionEventRecord message.
                         * @function verify
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        PartitionEventRecord.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp")) {
                                var error = $root.google.protobuf.Timestamp.verify(message.commitTimestamp);
                                if (error)
                                    return "commitTimestamp." + error;
                            }
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                if (!$util.isString(message.recordSequence))
                                    return "recordSequence: string expected";
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                if (!$util.isString(message.partitionToken))
                                    return "partitionToken: string expected";
                            if (message.moveInEvents != null && message.hasOwnProperty("moveInEvents")) {
                                if (!Array.isArray(message.moveInEvents))
                                    return "moveInEvents: array expected";
                                for (var i = 0; i < message.moveInEvents.length; ++i) {
                                    var error = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.verify(message.moveInEvents[i]);
                                    if (error)
                                        return "moveInEvents." + error;
                                }
                            }
                            if (message.moveOutEvents != null && message.hasOwnProperty("moveOutEvents")) {
                                if (!Array.isArray(message.moveOutEvents))
                                    return "moveOutEvents: array expected";
                                for (var i = 0; i < message.moveOutEvents.length; ++i) {
                                    var error = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.verify(message.moveOutEvents[i]);
                                    if (error)
                                        return "moveOutEvents." + error;
                                }
                            }
                            return null;
                        };
    
                        /**
                         * Creates a PartitionEventRecord message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord} PartitionEventRecord
                         */
                        PartitionEventRecord.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord)
                                return object;
                            var message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord();
                            if (object.commitTimestamp != null) {
                                if (typeof object.commitTimestamp !== "object")
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.commitTimestamp: object expected");
                                message.commitTimestamp = $root.google.protobuf.Timestamp.fromObject(object.commitTimestamp);
                            }
                            if (object.recordSequence != null)
                                message.recordSequence = String(object.recordSequence);
                            if (object.partitionToken != null)
                                message.partitionToken = String(object.partitionToken);
                            if (object.moveInEvents) {
                                if (!Array.isArray(object.moveInEvents))
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.moveInEvents: array expected");
                                message.moveInEvents = [];
                                for (var i = 0; i < object.moveInEvents.length; ++i) {
                                    if (typeof object.moveInEvents[i] !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.moveInEvents: object expected");
                                    message.moveInEvents[i] = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.fromObject(object.moveInEvents[i]);
                                }
                            }
                            if (object.moveOutEvents) {
                                if (!Array.isArray(object.moveOutEvents))
                                    throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.moveOutEvents: array expected");
                                message.moveOutEvents = [];
                                for (var i = 0; i < object.moveOutEvents.length; ++i) {
                                    if (typeof object.moveOutEvents[i] !== "object")
                                        throw TypeError(".google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.moveOutEvents: object expected");
                                    message.moveOutEvents[i] = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.fromObject(object.moveOutEvents[i]);
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a PartitionEventRecord message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord} message PartitionEventRecord
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        PartitionEventRecord.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults) {
                                object.moveInEvents = [];
                                object.moveOutEvents = [];
                            }
                            if (options.defaults) {
                                object.commitTimestamp = null;
                                object.recordSequence = "";
                                object.partitionToken = "";
                            }
                            if (message.commitTimestamp != null && message.hasOwnProperty("commitTimestamp"))
                                object.commitTimestamp = $root.google.protobuf.Timestamp.toObject(message.commitTimestamp, options);
                            if (message.recordSequence != null && message.hasOwnProperty("recordSequence"))
                                object.recordSequence = message.recordSequence;
                            if (message.partitionToken != null && message.hasOwnProperty("partitionToken"))
                                object.partitionToken = message.partitionToken;
                            if (message.moveInEvents && message.moveInEvents.length) {
                                object.moveInEvents = [];
                                for (var j = 0; j < message.moveInEvents.length; ++j)
                                    object.moveInEvents[j] = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.toObject(message.moveInEvents[j], options);
                            }
                            if (message.moveOutEvents && message.moveOutEvents.length) {
                                object.moveOutEvents = [];
                                for (var j = 0; j < message.moveOutEvents.length; ++j)
                                    object.moveOutEvents[j] = $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.toObject(message.moveOutEvents[j], options);
                            }
                            return object;
                        };
    
                        /**
                         * Converts this PartitionEventRecord to JSON.
                         * @function toJSON
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        PartitionEventRecord.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Gets the default type url for PartitionEventRecord
                         * @function getTypeUrl
                         * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                         * @static
                         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                         * @returns {string} The default type url
                         */
                        PartitionEventRecord.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                            if (typeUrlPrefix === undefined) {
                                typeUrlPrefix = "type.googleapis.com";
                            }
                            return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.PartitionEventRecord";
                        };
    
                        PartitionEventRecord.MoveInEvent = (function() {
    
                            /**
                             * Properties of a MoveInEvent.
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                             * @interface IMoveInEvent
                             * @property {string|null} [sourcePartitionToken] MoveInEvent sourcePartitionToken
                             */
    
                            /**
                             * Constructs a new MoveInEvent.
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                             * @classdesc Represents a MoveInEvent.
                             * @implements IMoveInEvent
                             * @constructor
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent=} [properties] Properties to set
                             */
                            function MoveInEvent(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * MoveInEvent sourcePartitionToken.
                             * @member {string} sourcePartitionToken
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @instance
                             */
                            MoveInEvent.prototype.sourcePartitionToken = "";
    
                            /**
                             * Creates a new MoveInEvent instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent=} [properties] Properties to set
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent} MoveInEvent instance
                             */
                            MoveInEvent.create = function create(properties) {
                                return new MoveInEvent(properties);
                            };
    
                            /**
                             * Encodes the specified MoveInEvent message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent} message MoveInEvent message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInEvent.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.sourcePartitionToken != null && Object.hasOwnProperty.call(message, "sourcePartitionToken"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.sourcePartitionToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified MoveInEvent message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveInEvent} message MoveInEvent message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveInEvent.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a MoveInEvent message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent} MoveInEvent
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInEvent.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.sourcePartitionToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a MoveInEvent message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent} MoveInEvent
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveInEvent.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a MoveInEvent message.
                             * @function verify
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            MoveInEvent.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.sourcePartitionToken != null && message.hasOwnProperty("sourcePartitionToken"))
                                    if (!$util.isString(message.sourcePartitionToken))
                                        return "sourcePartitionToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a MoveInEvent message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent} MoveInEvent
                             */
                            MoveInEvent.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent)
                                    return object;
                                var message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent();
                                if (object.sourcePartitionToken != null)
                                    message.sourcePartitionToken = String(object.sourcePartitionToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a MoveInEvent message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent} message MoveInEvent
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            MoveInEvent.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.sourcePartitionToken = "";
                                if (message.sourcePartitionToken != null && message.hasOwnProperty("sourcePartitionToken"))
                                    object.sourcePartitionToken = message.sourcePartitionToken;
                                return object;
                            };
    
                            /**
                             * Converts this MoveInEvent to JSON.
                             * @function toJSON
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            MoveInEvent.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for MoveInEvent
                             * @function getTypeUrl
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            MoveInEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveInEvent";
                            };
    
                            return MoveInEvent;
                        })();
    
                        PartitionEventRecord.MoveOutEvent = (function() {
    
                            /**
                             * Properties of a MoveOutEvent.
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                             * @interface IMoveOutEvent
                             * @property {string|null} [destinationPartitionToken] MoveOutEvent destinationPartitionToken
                             */
    
                            /**
                             * Constructs a new MoveOutEvent.
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord
                             * @classdesc Represents a MoveOutEvent.
                             * @implements IMoveOutEvent
                             * @constructor
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent=} [properties] Properties to set
                             */
                            function MoveOutEvent(properties) {
                                if (properties)
                                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                        if (properties[keys[i]] != null)
                                            this[keys[i]] = properties[keys[i]];
                            }
    
                            /**
                             * MoveOutEvent destinationPartitionToken.
                             * @member {string} destinationPartitionToken
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @instance
                             */
                            MoveOutEvent.prototype.destinationPartitionToken = "";
    
                            /**
                             * Creates a new MoveOutEvent instance using the specified properties.
                             * @function create
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent=} [properties] Properties to set
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent} MoveOutEvent instance
                             */
                            MoveOutEvent.create = function create(properties) {
                                return new MoveOutEvent(properties);
                            };
    
                            /**
                             * Encodes the specified MoveOutEvent message. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.verify|verify} messages.
                             * @function encode
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent} message MoveOutEvent message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveOutEvent.encode = function encode(message, writer) {
                                if (!writer)
                                    writer = $Writer.create();
                                if (message.destinationPartitionToken != null && Object.hasOwnProperty.call(message, "destinationPartitionToken"))
                                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.destinationPartitionToken);
                                return writer;
                            };
    
                            /**
                             * Encodes the specified MoveOutEvent message, length delimited. Does not implicitly {@link google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent.verify|verify} messages.
                             * @function encodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.IMoveOutEvent} message MoveOutEvent message or plain object to encode
                             * @param {$protobuf.Writer} [writer] Writer to encode to
                             * @returns {$protobuf.Writer} Writer
                             */
                            MoveOutEvent.encodeDelimited = function encodeDelimited(message, writer) {
                                return this.encode(message, writer).ldelim();
                            };
    
                            /**
                             * Decodes a MoveOutEvent message from the specified reader or buffer.
                             * @function decode
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @param {number} [length] Message length if known beforehand
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent} MoveOutEvent
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveOutEvent.decode = function decode(reader, length, error) {
                                if (!(reader instanceof $Reader))
                                    reader = $Reader.create(reader);
                                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent();
                                while (reader.pos < end) {
                                    var tag = reader.uint32();
                                    if (tag === error)
                                        break;
                                    switch (tag >>> 3) {
                                    case 1: {
                                            message.destinationPartitionToken = reader.string();
                                            break;
                                        }
                                    default:
                                        reader.skipType(tag & 7);
                                        break;
                                    }
                                }
                                return message;
                            };
    
                            /**
                             * Decodes a MoveOutEvent message from the specified reader or buffer, length delimited.
                             * @function decodeDelimited
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent} MoveOutEvent
                             * @throws {Error} If the payload is not a reader or valid buffer
                             * @throws {$protobuf.util.ProtocolError} If required fields are missing
                             */
                            MoveOutEvent.decodeDelimited = function decodeDelimited(reader) {
                                if (!(reader instanceof $Reader))
                                    reader = new $Reader(reader);
                                return this.decode(reader, reader.uint32());
                            };
    
                            /**
                             * Verifies a MoveOutEvent message.
                             * @function verify
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {Object.<string,*>} message Plain object to verify
                             * @returns {string|null} `null` if valid, otherwise the reason why it is not
                             */
                            MoveOutEvent.verify = function verify(message) {
                                if (typeof message !== "object" || message === null)
                                    return "object expected";
                                if (message.destinationPartitionToken != null && message.hasOwnProperty("destinationPartitionToken"))
                                    if (!$util.isString(message.destinationPartitionToken))
                                        return "destinationPartitionToken: string expected";
                                return null;
                            };
    
                            /**
                             * Creates a MoveOutEvent message from a plain object. Also converts values to their respective internal types.
                             * @function fromObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {Object.<string,*>} object Plain object
                             * @returns {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent} MoveOutEvent
                             */
                            MoveOutEvent.fromObject = function fromObject(object) {
                                if (object instanceof $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent)
                                    return object;
                                var message = new $root.google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent();
                                if (object.destinationPartitionToken != null)
                                    message.destinationPartitionToken = String(object.destinationPartitionToken);
                                return message;
                            };
    
                            /**
                             * Creates a plain object from a MoveOutEvent message. Also converts values to other types if specified.
                             * @function toObject
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent} message MoveOutEvent
                             * @param {$protobuf.IConversionOptions} [options] Conversion options
                             * @returns {Object.<string,*>} Plain object
                             */
                            MoveOutEvent.toObject = function toObject(message, options) {
                                if (!options)
                                    options = {};
                                var object = {};
                                if (options.defaults)
                                    object.destinationPartitionToken = "";
                                if (message.destinationPartitionToken != null && message.hasOwnProperty("destinationPartitionToken"))
                                    object.destinationPartitionToken = message.destinationPartitionToken;
                                return object;
                            };
    
                            /**
                             * Converts this MoveOutEvent to JSON.
                             * @function toJSON
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @instance
                             * @returns {Object.<string,*>} JSON object
                             */
                            MoveOutEvent.prototype.toJSON = function toJSON() {
                                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                            };
    
                            /**
                             * Gets the default type url for MoveOutEvent
                             * @function getTypeUrl
                             * @memberof google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent
                             * @static
                             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                             * @returns {string} The default type url
                             */
                            MoveOutEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                                if (typeUrlPrefix === undefined) {
                                    typeUrlPrefix = "type.googleapis.com";
                                }
                                return typeUrlPrefix + "/google.spanner.v1.ChangeStreamRecord.PartitionEventRecord.MoveOutEvent";
                            };
    
                            return MoveOutEvent;
                        })();
    
                        return PartitionEventRecord;
                    })();
    
                    return ChangeStreamRecord;
                })();
    
                return v1;
            })();
    
            return spanner;
        })();
    
        google.api = (function() {
    
            /**
             * Namespace api.
             * @memberof google
             * @namespace
             */
            var api = {};
    
            /**
             * FieldBehavior enum.
             * @name google.api.FieldBehavior
             * @enum {number}
             * @property {number} FIELD_BEHAVIOR_UNSPECIFIED=0 FIELD_BEHAVIOR_UNSPECIFIED value
             * @property {number} OPTIONAL=1 OPTIONAL value
             * @property {number} REQUIRED=2 REQUIRED value
             * @property {number} OUTPUT_ONLY=3 OUTPUT_ONLY value
             * @property {number} INPUT_ONLY=4 INPUT_ONLY value
             * @property {number} IMMUTABLE=5 IMMUTABLE value
             * @property {number} UNORDERED_LIST=6 UNORDERED_LIST value
             * @property {number} NON_EMPTY_DEFAULT=7 NON_EMPTY_DEFAULT value
             * @property {number} IDENTIFIER=8 IDENTIFIER value
             */
            api.FieldBehavior = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "FIELD_BEHAVIOR_UNSPECIFIED"] = 0;
                values[valuesById[1] = "OPTIONAL"] = 1;
                values[valuesById[2] = "REQUIRED"] = 2;
                values[valuesById[3] = "OUTPUT_ONLY"] = 3;
                values[valuesById[4] = "INPUT_ONLY"] = 4;
                values[valuesById[5] = "IMMUTABLE"] = 5;
                values[valuesById[6] = "UNORDERED_LIST"] = 6;
                values[valuesById[7] = "NON_EMPTY_DEFAULT"] = 7;
                values[valuesById[8] = "IDENTIFIER"] = 8;
                return values;
            })();
    
            api.ResourceDescriptor = (function() {
    
                /**
                 * Properties of a ResourceDescriptor.
                 * @memberof google.api
                 * @interface IResourceDescriptor
                 * @property {string|null} [type] ResourceDescriptor type
                 * @property {Array.<string>|null} [pattern] ResourceDescriptor pattern
                 * @property {string|null} [nameField] ResourceDescriptor nameField
                 * @property {google.api.ResourceDescriptor.History|null} [history] ResourceDescriptor history
                 * @property {string|null} [plural] ResourceDescriptor plural
                 * @property {string|null} [singular] ResourceDescriptor singular
                 * @property {Array.<google.api.ResourceDescriptor.Style>|null} [style] ResourceDescriptor style
                 */
    
                /**
                 * Constructs a new ResourceDescriptor.
                 * @memberof google.api
                 * @classdesc Represents a ResourceDescriptor.
                 * @implements IResourceDescriptor
                 * @constructor
                 * @param {google.api.IResourceDescriptor=} [properties] Properties to set
                 */
                function ResourceDescriptor(properties) {
                    this.pattern = [];
                    this.style = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ResourceDescriptor type.
                 * @member {string} type
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.type = "";
    
                /**
                 * ResourceDescriptor pattern.
                 * @member {Array.<string>} pattern
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.pattern = $util.emptyArray;
    
                /**
                 * ResourceDescriptor nameField.
                 * @member {string} nameField
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.nameField = "";
    
                /**
                 * ResourceDescriptor history.
                 * @member {google.api.ResourceDescriptor.History} history
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.history = 0;
    
                /**
                 * ResourceDescriptor plural.
                 * @member {string} plural
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.plural = "";
    
                /**
                 * ResourceDescriptor singular.
                 * @member {string} singular
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.singular = "";
    
                /**
                 * ResourceDescriptor style.
                 * @member {Array.<google.api.ResourceDescriptor.Style>} style
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.style = $util.emptyArray;
    
                /**
                 * Creates a new ResourceDescriptor instance using the specified properties.
                 * @function create
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor=} [properties] Properties to set
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor instance
                 */
                ResourceDescriptor.create = function create(properties) {
                    return new ResourceDescriptor(properties);
                };
    
                /**
                 * Encodes the specified ResourceDescriptor message. Does not implicitly {@link google.api.ResourceDescriptor.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor} message ResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceDescriptor.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.pattern != null && message.pattern.length)
                        for (var i = 0; i < message.pattern.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pattern[i]);
                    if (message.nameField != null && Object.hasOwnProperty.call(message, "nameField"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameField);
                    if (message.history != null && Object.hasOwnProperty.call(message, "history"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.history);
                    if (message.plural != null && Object.hasOwnProperty.call(message, "plural"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.plural);
                    if (message.singular != null && Object.hasOwnProperty.call(message, "singular"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.singular);
                    if (message.style != null && message.style.length) {
                        writer.uint32(/* id 10, wireType 2 =*/82).fork();
                        for (var i = 0; i < message.style.length; ++i)
                            writer.int32(message.style[i]);
                        writer.ldelim();
                    }
                    return writer;
                };
    
                /**
                 * Encodes the specified ResourceDescriptor message, length delimited. Does not implicitly {@link google.api.ResourceDescriptor.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor} message ResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ResourceDescriptor message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceDescriptor.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.ResourceDescriptor();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.type = reader.string();
                                break;
                            }
                        case 2: {
                                if (!(message.pattern && message.pattern.length))
                                    message.pattern = [];
                                message.pattern.push(reader.string());
                                break;
                            }
                        case 3: {
                                message.nameField = reader.string();
                                break;
                            }
                        case 4: {
                                message.history = reader.int32();
                                break;
                            }
                        case 5: {
                                message.plural = reader.string();
                                break;
                            }
                        case 6: {
                                message.singular = reader.string();
                                break;
                            }
                        case 10: {
                                if (!(message.style && message.style.length))
                                    message.style = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.style.push(reader.int32());
                                } else
                                    message.style.push(reader.int32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ResourceDescriptor message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceDescriptor.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ResourceDescriptor message.
                 * @function verify
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ResourceDescriptor.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.pattern != null && message.hasOwnProperty("pattern")) {
                        if (!Array.isArray(message.pattern))
                            return "pattern: array expected";
                        for (var i = 0; i < message.pattern.length; ++i)
                            if (!$util.isString(message.pattern[i]))
                                return "pattern: string[] expected";
                    }
                    if (message.nameField != null && message.hasOwnProperty("nameField"))
                        if (!$util.isString(message.nameField))
                            return "nameField: string expected";
                    if (message.history != null && message.hasOwnProperty("history"))
                        switch (message.history) {
                        default:
                            return "history: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.plural != null && message.hasOwnProperty("plural"))
                        if (!$util.isString(message.plural))
                            return "plural: string expected";
                    if (message.singular != null && message.hasOwnProperty("singular"))
                        if (!$util.isString(message.singular))
                            return "singular: string expected";
                    if (message.style != null && message.hasOwnProperty("style")) {
                        if (!Array.isArray(message.style))
                            return "style: array expected";
                        for (var i = 0; i < message.style.length; ++i)
                            switch (message.style[i]) {
                            default:
                                return "style: enum value[] expected";
                            case 0:
                            case 1:
                                break;
                            }
                    }
                    return null;
                };
    
                /**
                 * Creates a ResourceDescriptor message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 */
                ResourceDescriptor.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.ResourceDescriptor)
                        return object;
                    var message = new $root.google.api.ResourceDescriptor();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.pattern) {
                        if (!Array.isArray(object.pattern))
                            throw TypeError(".google.api.ResourceDescriptor.pattern: array expected");
                        message.pattern = [];
                        for (var i = 0; i < object.pattern.length; ++i)
                            message.pattern[i] = String(object.pattern[i]);
                    }
                    if (object.nameField != null)
                        message.nameField = String(object.nameField);
                    switch (object.history) {
                    default:
                        if (typeof object.history === "number") {
                            message.history = object.history;
                            break;
                        }
                        break;
                    case "HISTORY_UNSPECIFIED":
                    case 0:
                        message.history = 0;
                        break;
                    case "ORIGINALLY_SINGLE_PATTERN":
                    case 1:
                        message.history = 1;
                        break;
                    case "FUTURE_MULTI_PATTERN":
                    case 2:
                        message.history = 2;
                        break;
                    }
                    if (object.plural != null)
                        message.plural = String(object.plural);
                    if (object.singular != null)
                        message.singular = String(object.singular);
                    if (object.style) {
                        if (!Array.isArray(object.style))
                            throw TypeError(".google.api.ResourceDescriptor.style: array expected");
                        message.style = [];
                        for (var i = 0; i < object.style.length; ++i)
                            switch (object.style[i]) {
                            default:
                                if (typeof object.style[i] === "number") {
                                    message.style[i] = object.style[i];
                                    break;
                                }
                            case "STYLE_UNSPECIFIED":
                            case 0:
                                message.style[i] = 0;
                                break;
                            case "DECLARATIVE_FRIENDLY":
                            case 1:
                                message.style[i] = 1;
                                break;
                            }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ResourceDescriptor message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.ResourceDescriptor} message ResourceDescriptor
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ResourceDescriptor.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.pattern = [];
                        object.style = [];
                    }
                    if (options.defaults) {
                        object.type = "";
                        object.nameField = "";
                        object.history = options.enums === String ? "HISTORY_UNSPECIFIED" : 0;
                        object.plural = "";
                        object.singular = "";
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.pattern && message.pattern.length) {
                        object.pattern = [];
                        for (var j = 0; j < message.pattern.length; ++j)
                            object.pattern[j] = message.pattern[j];
                    }
                    if (message.nameField != null && message.hasOwnProperty("nameField"))
                        object.nameField = message.nameField;
                    if (message.history != null && message.hasOwnProperty("history"))
                        object.history = options.enums === String ? $root.google.api.ResourceDescriptor.History[message.history] === undefined ? message.history : $root.google.api.ResourceDescriptor.History[message.history] : message.history;
                    if (message.plural != null && message.hasOwnProperty("plural"))
                        object.plural = message.plural;
                    if (message.singular != null && message.hasOwnProperty("singular"))
                        object.singular = message.singular;
                    if (message.style && message.style.length) {
                        object.style = [];
                        for (var j = 0; j < message.style.length; ++j)
                            object.style[j] = options.enums === String ? $root.google.api.ResourceDescriptor.Style[message.style[j]] === undefined ? message.style[j] : $root.google.api.ResourceDescriptor.Style[message.style[j]] : message.style[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this ResourceDescriptor to JSON.
                 * @function toJSON
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ResourceDescriptor.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ResourceDescriptor
                 * @function getTypeUrl
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ResourceDescriptor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.ResourceDescriptor";
                };
    
                /**
                 * History enum.
                 * @name google.api.ResourceDescriptor.History
                 * @enum {number}
                 * @property {number} HISTORY_UNSPECIFIED=0 HISTORY_UNSPECIFIED value
                 * @property {number} ORIGINALLY_SINGLE_PATTERN=1 ORIGINALLY_SINGLE_PATTERN value
                 * @property {number} FUTURE_MULTI_PATTERN=2 FUTURE_MULTI_PATTERN value
                 */
                ResourceDescriptor.History = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "HISTORY_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "ORIGINALLY_SINGLE_PATTERN"] = 1;
                    values[valuesById[2] = "FUTURE_MULTI_PATTERN"] = 2;
                    return values;
                })();
    
                /**
                 * Style enum.
                 * @name google.api.ResourceDescriptor.Style
                 * @enum {number}
                 * @property {number} STYLE_UNSPECIFIED=0 STYLE_UNSPECIFIED value
                 * @property {number} DECLARATIVE_FRIENDLY=1 DECLARATIVE_FRIENDLY value
                 */
                ResourceDescriptor.Style = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "STYLE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "DECLARATIVE_FRIENDLY"] = 1;
                    return values;
                })();
    
                return ResourceDescriptor;
            })();
    
            api.ResourceReference = (function() {
    
                /**
                 * Properties of a ResourceReference.
                 * @memberof google.api
                 * @interface IResourceReference
                 * @property {string|null} [type] ResourceReference type
                 * @property {string|null} [childType] ResourceReference childType
                 */
    
                /**
                 * Constructs a new ResourceReference.
                 * @memberof google.api
                 * @classdesc Represents a ResourceReference.
                 * @implements IResourceReference
                 * @constructor
                 * @param {google.api.IResourceReference=} [properties] Properties to set
                 */
                function ResourceReference(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ResourceReference type.
                 * @member {string} type
                 * @memberof google.api.ResourceReference
                 * @instance
                 */
                ResourceReference.prototype.type = "";
    
                /**
                 * ResourceReference childType.
                 * @member {string} childType
                 * @memberof google.api.ResourceReference
                 * @instance
                 */
                ResourceReference.prototype.childType = "";
    
                /**
                 * Creates a new ResourceReference instance using the specified properties.
                 * @function create
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference=} [properties] Properties to set
                 * @returns {google.api.ResourceReference} ResourceReference instance
                 */
                ResourceReference.create = function create(properties) {
                    return new ResourceReference(properties);
                };
    
                /**
                 * Encodes the specified ResourceReference message. Does not implicitly {@link google.api.ResourceReference.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference} message ResourceReference message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceReference.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.childType != null && Object.hasOwnProperty.call(message, "childType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.childType);
                    return writer;
                };
    
                /**
                 * Encodes the specified ResourceReference message, length delimited. Does not implicitly {@link google.api.ResourceReference.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference} message ResourceReference message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceReference.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ResourceReference message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.ResourceReference} ResourceReference
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceReference.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.ResourceReference();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.type = reader.string();
                                break;
                            }
                        case 2: {
                                message.childType = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ResourceReference message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.ResourceReference} ResourceReference
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceReference.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ResourceReference message.
                 * @function verify
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ResourceReference.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.childType != null && message.hasOwnProperty("childType"))
                        if (!$util.isString(message.childType))
                            return "childType: string expected";
                    return null;
                };
    
                /**
                 * Creates a ResourceReference message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.ResourceReference} ResourceReference
                 */
                ResourceReference.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.ResourceReference)
                        return object;
                    var message = new $root.google.api.ResourceReference();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.childType != null)
                        message.childType = String(object.childType);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ResourceReference message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.ResourceReference} message ResourceReference
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ResourceReference.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.type = "";
                        object.childType = "";
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.childType != null && message.hasOwnProperty("childType"))
                        object.childType = message.childType;
                    return object;
                };
    
                /**
                 * Converts this ResourceReference to JSON.
                 * @function toJSON
                 * @memberof google.api.ResourceReference
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ResourceReference.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ResourceReference
                 * @function getTypeUrl
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ResourceReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.ResourceReference";
                };
    
                return ResourceReference;
            })();
    
            api.Http = (function() {
    
                /**
                 * Properties of a Http.
                 * @memberof google.api
                 * @interface IHttp
                 * @property {Array.<google.api.IHttpRule>|null} [rules] Http rules
                 * @property {boolean|null} [fullyDecodeReservedExpansion] Http fullyDecodeReservedExpansion
                 */
    
                /**
                 * Constructs a new Http.
                 * @memberof google.api
                 * @classdesc Represents a Http.
                 * @implements IHttp
                 * @constructor
                 * @param {google.api.IHttp=} [properties] Properties to set
                 */
                function Http(properties) {
                    this.rules = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Http rules.
                 * @member {Array.<google.api.IHttpRule>} rules
                 * @memberof google.api.Http
                 * @instance
                 */
                Http.prototype.rules = $util.emptyArray;
    
                /**
                 * Http fullyDecodeReservedExpansion.
                 * @member {boolean} fullyDecodeReservedExpansion
                 * @memberof google.api.Http
                 * @instance
                 */
                Http.prototype.fullyDecodeReservedExpansion = false;
    
                /**
                 * Creates a new Http instance using the specified properties.
                 * @function create
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp=} [properties] Properties to set
                 * @returns {google.api.Http} Http instance
                 */
                Http.create = function create(properties) {
                    return new Http(properties);
                };
    
                /**
                 * Encodes the specified Http message. Does not implicitly {@link google.api.Http.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp} message Http message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Http.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.rules != null && message.rules.length)
                        for (var i = 0; i < message.rules.length; ++i)
                            $root.google.api.HttpRule.encode(message.rules[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.fullyDecodeReservedExpansion != null && Object.hasOwnProperty.call(message, "fullyDecodeReservedExpansion"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.fullyDecodeReservedExpansion);
                    return writer;
                };
    
                /**
                 * Encodes the specified Http message, length delimited. Does not implicitly {@link google.api.Http.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp} message Http message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Http.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Http message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.Http
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.Http} Http
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Http.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Http();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.rules && message.rules.length))
                                    message.rules = [];
                                message.rules.push($root.google.api.HttpRule.decode(reader, reader.uint32()));
                                break;
                            }
                        case 2: {
                                message.fullyDecodeReservedExpansion = reader.bool();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Http message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.Http
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.Http} Http
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Http.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Http message.
                 * @function verify
                 * @memberof google.api.Http
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Http.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.rules != null && message.hasOwnProperty("rules")) {
                        if (!Array.isArray(message.rules))
                            return "rules: array expected";
                        for (var i = 0; i < message.rules.length; ++i) {
                            var error = $root.google.api.HttpRule.verify(message.rules[i]);
                            if (error)
                                return "rules." + error;
                        }
                    }
                    if (message.fullyDecodeReservedExpansion != null && message.hasOwnProperty("fullyDecodeReservedExpansion"))
                        if (typeof message.fullyDecodeReservedExpansion !== "boolean")
                            return "fullyDecodeReservedExpansion: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a Http message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.Http
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.Http} Http
                 */
                Http.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.Http)
                        return object;
                    var message = new $root.google.api.Http();
                    if (object.rules) {
                        if (!Array.isArray(object.rules))
                            throw TypeError(".google.api.Http.rules: array expected");
                        message.rules = [];
                        for (var i = 0; i < object.rules.length; ++i) {
                            if (typeof object.rules[i] !== "object")
                                throw TypeError(".google.api.Http.rules: object expected");
                            message.rules[i] = $root.google.api.HttpRule.fromObject(object.rules[i]);
                        }
                    }
                    if (object.fullyDecodeReservedExpansion != null)
                        message.fullyDecodeReservedExpansion = Boolean(object.fullyDecodeReservedExpansion);
                    return message;
                };
    
                /**
                 * Creates a plain object from a Http message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.Http} message Http
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Http.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.rules = [];
                    if (options.defaults)
                        object.fullyDecodeReservedExpansion = false;
                    if (message.rules && message.rules.length) {
                        object.rules = [];
                        for (var j = 0; j < message.rules.length; ++j)
                            object.rules[j] = $root.google.api.HttpRule.toObject(message.rules[j], options);
                    }
                    if (message.fullyDecodeReservedExpansion != null && message.hasOwnProperty("fullyDecodeReservedExpansion"))
                        object.fullyDecodeReservedExpansion = message.fullyDecodeReservedExpansion;
                    return object;
                };
    
                /**
                 * Converts this Http to JSON.
                 * @function toJSON
                 * @memberof google.api.Http
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Http.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Http
                 * @function getTypeUrl
                 * @memberof google.api.Http
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Http.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.Http";
                };
    
                return Http;
            })();
    
            api.HttpRule = (function() {
    
                /**
                 * Properties of a HttpRule.
                 * @memberof google.api
                 * @interface IHttpRule
                 * @property {string|null} [selector] HttpRule selector
                 * @property {string|null} [get] HttpRule get
                 * @property {string|null} [put] HttpRule put
                 * @property {string|null} [post] HttpRule post
                 * @property {string|null} ["delete"] HttpRule delete
                 * @property {string|null} [patch] HttpRule patch
                 * @property {google.api.ICustomHttpPattern|null} [custom] HttpRule custom
                 * @property {string|null} [body] HttpRule body
                 * @property {string|null} [responseBody] HttpRule responseBody
                 * @property {Array.<google.api.IHttpRule>|null} [additionalBindings] HttpRule additionalBindings
                 */
    
                /**
                 * Constructs a new HttpRule.
                 * @memberof google.api
                 * @classdesc Represents a HttpRule.
                 * @implements IHttpRule
                 * @constructor
                 * @param {google.api.IHttpRule=} [properties] Properties to set
                 */
                function HttpRule(properties) {
                    this.additionalBindings = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * HttpRule selector.
                 * @member {string} selector
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.selector = "";
    
                /**
                 * HttpRule get.
                 * @member {string|null|undefined} get
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.get = null;
    
                /**
                 * HttpRule put.
                 * @member {string|null|undefined} put
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.put = null;
    
                /**
                 * HttpRule post.
                 * @member {string|null|undefined} post
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.post = null;
    
                /**
                 * HttpRule delete.
                 * @member {string|null|undefined} delete
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype["delete"] = null;
    
                /**
                 * HttpRule patch.
                 * @member {string|null|undefined} patch
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.patch = null;
    
                /**
                 * HttpRule custom.
                 * @member {google.api.ICustomHttpPattern|null|undefined} custom
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.custom = null;
    
                /**
                 * HttpRule body.
                 * @member {string} body
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.body = "";
    
                /**
                 * HttpRule responseBody.
                 * @member {string} responseBody
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.responseBody = "";
    
                /**
                 * HttpRule additionalBindings.
                 * @member {Array.<google.api.IHttpRule>} additionalBindings
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.additionalBindings = $util.emptyArray;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * HttpRule pattern.
                 * @member {"get"|"put"|"post"|"delete"|"patch"|"custom"|undefined} pattern
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                Object.defineProperty(HttpRule.prototype, "pattern", {
                    get: $util.oneOfGetter($oneOfFields = ["get", "put", "post", "delete", "patch", "custom"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new HttpRule instance using the specified properties.
                 * @function create
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule=} [properties] Properties to set
                 * @returns {google.api.HttpRule} HttpRule instance
                 */
                HttpRule.create = function create(properties) {
                    return new HttpRule(properties);
                };
    
                /**
                 * Encodes the specified HttpRule message. Does not implicitly {@link google.api.HttpRule.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule} message HttpRule message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                HttpRule.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.selector != null && Object.hasOwnProperty.call(message, "selector"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.selector);
                    if (message.get != null && Object.hasOwnProperty.call(message, "get"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.get);
                    if (message.put != null && Object.hasOwnProperty.call(message, "put"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.put);
                    if (message.post != null && Object.hasOwnProperty.call(message, "post"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.post);
                    if (message["delete"] != null && Object.hasOwnProperty.call(message, "delete"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message["delete"]);
                    if (message.patch != null && Object.hasOwnProperty.call(message, "patch"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.patch);
                    if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.body);
                    if (message.custom != null && Object.hasOwnProperty.call(message, "custom"))
                        $root.google.api.CustomHttpPattern.encode(message.custom, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.additionalBindings != null && message.additionalBindings.length)
                        for (var i = 0; i < message.additionalBindings.length; ++i)
                            $root.google.api.HttpRule.encode(message.additionalBindings[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                    if (message.responseBody != null && Object.hasOwnProperty.call(message, "responseBody"))
                        writer.uint32(/* id 12, wireType 2 =*/98).string(message.responseBody);
                    return writer;
                };
    
                /**
                 * Encodes the specified HttpRule message, length delimited. Does not implicitly {@link google.api.HttpRule.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule} message HttpRule message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                HttpRule.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a HttpRule message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.HttpRule} HttpRule
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                HttpRule.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.HttpRule();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.selector = reader.string();
                                break;
                            }
                        case 2: {
                                message.get = reader.string();
                                break;
                            }
                        case 3: {
                                message.put = reader.string();
                                break;
                            }
                        case 4: {
                                message.post = reader.string();
                                break;
                            }
                        case 5: {
                                message["delete"] = reader.string();
                                break;
                            }
                        case 6: {
                                message.patch = reader.string();
                                break;
                            }
                        case 8: {
                                message.custom = $root.google.api.CustomHttpPattern.decode(reader, reader.uint32());
                                break;
                            }
                        case 7: {
                                message.body = reader.string();
                                break;
                            }
                        case 12: {
                                message.responseBody = reader.string();
                                break;
                            }
                        case 11: {
                                if (!(message.additionalBindings && message.additionalBindings.length))
                                    message.additionalBindings = [];
                                message.additionalBindings.push($root.google.api.HttpRule.decode(reader, reader.uint32()));
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a HttpRule message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.HttpRule} HttpRule
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                HttpRule.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a HttpRule message.
                 * @function verify
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                HttpRule.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        if (!$util.isString(message.selector))
                            return "selector: string expected";
                    if (message.get != null && message.hasOwnProperty("get")) {
                        properties.pattern = 1;
                        if (!$util.isString(message.get))
                            return "get: string expected";
                    }
                    if (message.put != null && message.hasOwnProperty("put")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.put))
                            return "put: string expected";
                    }
                    if (message.post != null && message.hasOwnProperty("post")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.post))
                            return "post: string expected";
                    }
                    if (message["delete"] != null && message.hasOwnProperty("delete")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message["delete"]))
                            return "delete: string expected";
                    }
                    if (message.patch != null && message.hasOwnProperty("patch")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.patch))
                            return "patch: string expected";
                    }
                    if (message.custom != null && message.hasOwnProperty("custom")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        {
                            var error = $root.google.api.CustomHttpPattern.verify(message.custom);
                            if (error)
                                return "custom." + error;
                        }
                    }
                    if (message.body != null && message.hasOwnProperty("body"))
                        if (!$util.isString(message.body))
                            return "body: string expected";
                    if (message.responseBody != null && message.hasOwnProperty("responseBody"))
                        if (!$util.isString(message.responseBody))
                            return "responseBody: string expected";
                    if (message.additionalBindings != null && message.hasOwnProperty("additionalBindings")) {
                        if (!Array.isArray(message.additionalBindings))
                            return "additionalBindings: array expected";
                        for (var i = 0; i < message.additionalBindings.length; ++i) {
                            var error = $root.google.api.HttpRule.verify(message.additionalBindings[i]);
                            if (error)
                                return "additionalBindings." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a HttpRule message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.HttpRule} HttpRule
                 */
                HttpRule.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.HttpRule)
                        return object;
                    var message = new $root.google.api.HttpRule();
                    if (object.selector != null)
                        message.selector = String(object.selector);
                    if (object.get != null)
                        message.get = String(object.get);
                    if (object.put != null)
                        message.put = String(object.put);
                    if (object.post != null)
                        message.post = String(object.post);
                    if (object["delete"] != null)
                        message["delete"] = String(object["delete"]);
                    if (object.patch != null)
                        message.patch = String(object.patch);
                    if (object.custom != null) {
                        if (typeof object.custom !== "object")
                            throw TypeError(".google.api.HttpRule.custom: object expected");
                        message.custom = $root.google.api.CustomHttpPattern.fromObject(object.custom);
                    }
                    if (object.body != null)
                        message.body = String(object.body);
                    if (object.responseBody != null)
                        message.responseBody = String(object.responseBody);
                    if (object.additionalBindings) {
                        if (!Array.isArray(object.additionalBindings))
                            throw TypeError(".google.api.HttpRule.additionalBindings: array expected");
                        message.additionalBindings = [];
                        for (var i = 0; i < object.additionalBindings.length; ++i) {
                            if (typeof object.additionalBindings[i] !== "object")
                                throw TypeError(".google.api.HttpRule.additionalBindings: object expected");
                            message.additionalBindings[i] = $root.google.api.HttpRule.fromObject(object.additionalBindings[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a HttpRule message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.HttpRule} message HttpRule
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                HttpRule.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.additionalBindings = [];
                    if (options.defaults) {
                        object.selector = "";
                        object.body = "";
                        object.responseBody = "";
                    }
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        object.selector = message.selector;
                    if (message.get != null && message.hasOwnProperty("get")) {
                        object.get = message.get;
                        if (options.oneofs)
                            object.pattern = "get";
                    }
                    if (message.put != null && message.hasOwnProperty("put")) {
                        object.put = message.put;
                        if (options.oneofs)
                            object.pattern = "put";
                    }
                    if (message.post != null && message.hasOwnProperty("post")) {
                        object.post = message.post;
                        if (options.oneofs)
                            object.pattern = "post";
                    }
                    if (message["delete"] != null && message.hasOwnProperty("delete")) {
                        object["delete"] = message["delete"];
                        if (options.oneofs)
                            object.pattern = "delete";
                    }
                    if (message.patch != null && message.hasOwnProperty("patch")) {
                        object.patch = message.patch;
                        if (options.oneofs)
                            object.pattern = "patch";
                    }
                    if (message.body != null && message.hasOwnProperty("body"))
                        object.body = message.body;
                    if (message.custom != null && message.hasOwnProperty("custom")) {
                        object.custom = $root.google.api.CustomHttpPattern.toObject(message.custom, options);
                        if (options.oneofs)
                            object.pattern = "custom";
                    }
                    if (message.additionalBindings && message.additionalBindings.length) {
                        object.additionalBindings = [];
                        for (var j = 0; j < message.additionalBindings.length; ++j)
                            object.additionalBindings[j] = $root.google.api.HttpRule.toObject(message.additionalBindings[j], options);
                    }
                    if (message.responseBody != null && message.hasOwnProperty("responseBody"))
                        object.responseBody = message.responseBody;
                    return object;
                };
    
                /**
                 * Converts this HttpRule to JSON.
                 * @function toJSON
                 * @memberof google.api.HttpRule
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                HttpRule.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for HttpRule
                 * @function getTypeUrl
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                HttpRule.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.HttpRule";
                };
    
                return HttpRule;
            })();
    
            api.CustomHttpPattern = (function() {
    
                /**
                 * Properties of a CustomHttpPattern.
                 * @memberof google.api
                 * @interface ICustomHttpPattern
                 * @property {string|null} [kind] CustomHttpPattern kind
                 * @property {string|null} [path] CustomHttpPattern path
                 */
    
                /**
                 * Constructs a new CustomHttpPattern.
                 * @memberof google.api
                 * @classdesc Represents a CustomHttpPattern.
                 * @implements ICustomHttpPattern
                 * @constructor
                 * @param {google.api.ICustomHttpPattern=} [properties] Properties to set
                 */
                function CustomHttpPattern(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CustomHttpPattern kind.
                 * @member {string} kind
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 */
                CustomHttpPattern.prototype.kind = "";
    
                /**
                 * CustomHttpPattern path.
                 * @member {string} path
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 */
                CustomHttpPattern.prototype.path = "";
    
                /**
                 * Creates a new CustomHttpPattern instance using the specified properties.
                 * @function create
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern=} [properties] Properties to set
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern instance
                 */
                CustomHttpPattern.create = function create(properties) {
                    return new CustomHttpPattern(properties);
                };
    
                /**
                 * Encodes the specified CustomHttpPattern message. Does not implicitly {@link google.api.CustomHttpPattern.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern} message CustomHttpPattern message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CustomHttpPattern.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.kind != null && Object.hasOwnProperty.call(message, "kind"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.kind);
                    if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                    return writer;
                };
    
                /**
                 * Encodes the specified CustomHttpPattern message, length delimited. Does not implicitly {@link google.api.CustomHttpPattern.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern} message CustomHttpPattern message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CustomHttpPattern.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CustomHttpPattern message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CustomHttpPattern.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.CustomHttpPattern();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.kind = reader.string();
                                break;
                            }
                        case 2: {
                                message.path = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CustomHttpPattern message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CustomHttpPattern.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CustomHttpPattern message.
                 * @function verify
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CustomHttpPattern.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.kind != null && message.hasOwnProperty("kind"))
                        if (!$util.isString(message.kind))
                            return "kind: string expected";
                    if (message.path != null && message.hasOwnProperty("path"))
                        if (!$util.isString(message.path))
                            return "path: string expected";
                    return null;
                };
    
                /**
                 * Creates a CustomHttpPattern message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 */
                CustomHttpPattern.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.CustomHttpPattern)
                        return object;
                    var message = new $root.google.api.CustomHttpPattern();
                    if (object.kind != null)
                        message.kind = String(object.kind);
                    if (object.path != null)
                        message.path = String(object.path);
                    return message;
                };
    
                /**
                 * Creates a plain object from a CustomHttpPattern message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.CustomHttpPattern} message CustomHttpPattern
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CustomHttpPattern.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.kind = "";
                        object.path = "";
                    }
                    if (message.kind != null && message.hasOwnProperty("kind"))
                        object.kind = message.kind;
                    if (message.path != null && message.hasOwnProperty("path"))
                        object.path = message.path;
                    return object;
                };
    
                /**
                 * Converts this CustomHttpPattern to JSON.
                 * @function toJSON
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CustomHttpPattern.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for CustomHttpPattern
                 * @function getTypeUrl
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                CustomHttpPattern.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.CustomHttpPattern";
                };
    
                return CustomHttpPattern;
            })();
    
            api.CommonLanguageSettings = (function() {
    
                /**
                 * Properties of a CommonLanguageSettings.
                 * @memberof google.api
                 * @interface ICommonLanguageSettings
                 * @property {string|null} [referenceDocsUri] CommonLanguageSettings referenceDocsUri
                 * @property {Array.<google.api.ClientLibraryDestination>|null} [destinations] CommonLanguageSettings destinations
                 * @property {google.api.ISelectiveGapicGeneration|null} [selectiveGapicGeneration] CommonLanguageSettings selectiveGapicGeneration
                 */
    
                /**
                 * Constructs a new CommonLanguageSettings.
                 * @memberof google.api
                 * @classdesc Represents a CommonLanguageSettings.
                 * @implements ICommonLanguageSettings
                 * @constructor
                 * @param {google.api.ICommonLanguageSettings=} [properties] Properties to set
                 */
                function CommonLanguageSettings(properties) {
                    this.destinations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CommonLanguageSettings referenceDocsUri.
                 * @member {string} referenceDocsUri
                 * @memberof google.api.CommonLanguageSettings
                 * @instance
                 */
                CommonLanguageSettings.prototype.referenceDocsUri = "";
    
                /**
                 * CommonLanguageSettings destinations.
                 * @member {Array.<google.api.ClientLibraryDestination>} destinations
                 * @memberof google.api.CommonLanguageSettings
                 * @instance
                 */
                CommonLanguageSettings.prototype.destinations = $util.emptyArray;
    
                /**
                 * CommonLanguageSettings selectiveGapicGeneration.
                 * @member {google.api.ISelectiveGapicGeneration|null|undefined} selectiveGapicGeneration
                 * @memberof google.api.CommonLanguageSettings
                 * @instance
                 */
                CommonLanguageSettings.prototype.selectiveGapicGeneration = null;
    
                /**
                 * Creates a new CommonLanguageSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {google.api.ICommonLanguageSettings=} [properties] Properties to set
                 * @returns {google.api.CommonLanguageSettings} CommonLanguageSettings instance
                 */
                CommonLanguageSettings.create = function create(properties) {
                    return new CommonLanguageSettings(properties);
                };
    
                /**
                 * Encodes the specified CommonLanguageSettings message. Does not implicitly {@link google.api.CommonLanguageSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {google.api.ICommonLanguageSettings} message CommonLanguageSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CommonLanguageSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.referenceDocsUri != null && Object.hasOwnProperty.call(message, "referenceDocsUri"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.referenceDocsUri);
                    if (message.destinations != null && message.destinations.length) {
                        writer.uint32(/* id 2, wireType 2 =*/18).fork();
                        for (var i = 0; i < message.destinations.length; ++i)
                            writer.int32(message.destinations[i]);
                        writer.ldelim();
                    }
                    if (message.selectiveGapicGeneration != null && Object.hasOwnProperty.call(message, "selectiveGapicGeneration"))
                        $root.google.api.SelectiveGapicGeneration.encode(message.selectiveGapicGeneration, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified CommonLanguageSettings message, length delimited. Does not implicitly {@link google.api.CommonLanguageSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {google.api.ICommonLanguageSettings} message CommonLanguageSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CommonLanguageSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CommonLanguageSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.CommonLanguageSettings} CommonLanguageSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CommonLanguageSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.CommonLanguageSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.referenceDocsUri = reader.string();
                                break;
                            }
                        case 2: {
                                if (!(message.destinations && message.destinations.length))
                                    message.destinations = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.destinations.push(reader.int32());
                                } else
                                    message.destinations.push(reader.int32());
                                break;
                            }
                        case 3: {
                                message.selectiveGapicGeneration = $root.google.api.SelectiveGapicGeneration.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CommonLanguageSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.CommonLanguageSettings} CommonLanguageSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CommonLanguageSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CommonLanguageSettings message.
                 * @function verify
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CommonLanguageSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.referenceDocsUri != null && message.hasOwnProperty("referenceDocsUri"))
                        if (!$util.isString(message.referenceDocsUri))
                            return "referenceDocsUri: string expected";
                    if (message.destinations != null && message.hasOwnProperty("destinations")) {
                        if (!Array.isArray(message.destinations))
                            return "destinations: array expected";
                        for (var i = 0; i < message.destinations.length; ++i)
                            switch (message.destinations[i]) {
                            default:
                                return "destinations: enum value[] expected";
                            case 0:
                            case 10:
                            case 20:
                                break;
                            }
                    }
                    if (message.selectiveGapicGeneration != null && message.hasOwnProperty("selectiveGapicGeneration")) {
                        var error = $root.google.api.SelectiveGapicGeneration.verify(message.selectiveGapicGeneration);
                        if (error)
                            return "selectiveGapicGeneration." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a CommonLanguageSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.CommonLanguageSettings} CommonLanguageSettings
                 */
                CommonLanguageSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.CommonLanguageSettings)
                        return object;
                    var message = new $root.google.api.CommonLanguageSettings();
                    if (object.referenceDocsUri != null)
                        message.referenceDocsUri = String(object.referenceDocsUri);
                    if (object.destinations) {
                        if (!Array.isArray(object.destinations))
                            throw TypeError(".google.api.CommonLanguageSettings.destinations: array expected");
                        message.destinations = [];
                        for (var i = 0; i < object.destinations.length; ++i)
                            switch (object.destinations[i]) {
                            default:
                                if (typeof object.destinations[i] === "number") {
                                    message.destinations[i] = object.destinations[i];
                                    break;
                                }
                            case "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED":
                            case 0:
                                message.destinations[i] = 0;
                                break;
                            case "GITHUB":
                            case 10:
                                message.destinations[i] = 10;
                                break;
                            case "PACKAGE_MANAGER":
                            case 20:
                                message.destinations[i] = 20;
                                break;
                            }
                    }
                    if (object.selectiveGapicGeneration != null) {
                        if (typeof object.selectiveGapicGeneration !== "object")
                            throw TypeError(".google.api.CommonLanguageSettings.selectiveGapicGeneration: object expected");
                        message.selectiveGapicGeneration = $root.google.api.SelectiveGapicGeneration.fromObject(object.selectiveGapicGeneration);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a CommonLanguageSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {google.api.CommonLanguageSettings} message CommonLanguageSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CommonLanguageSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.destinations = [];
                    if (options.defaults) {
                        object.referenceDocsUri = "";
                        object.selectiveGapicGeneration = null;
                    }
                    if (message.referenceDocsUri != null && message.hasOwnProperty("referenceDocsUri"))
                        object.referenceDocsUri = message.referenceDocsUri;
                    if (message.destinations && message.destinations.length) {
                        object.destinations = [];
                        for (var j = 0; j < message.destinations.length; ++j)
                            object.destinations[j] = options.enums === String ? $root.google.api.ClientLibraryDestination[message.destinations[j]] === undefined ? message.destinations[j] : $root.google.api.ClientLibraryDestination[message.destinations[j]] : message.destinations[j];
                    }
                    if (message.selectiveGapicGeneration != null && message.hasOwnProperty("selectiveGapicGeneration"))
                        object.selectiveGapicGeneration = $root.google.api.SelectiveGapicGeneration.toObject(message.selectiveGapicGeneration, options);
                    return object;
                };
    
                /**
                 * Converts this CommonLanguageSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.CommonLanguageSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CommonLanguageSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for CommonLanguageSettings
                 * @function getTypeUrl
                 * @memberof google.api.CommonLanguageSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                CommonLanguageSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.CommonLanguageSettings";
                };
    
                return CommonLanguageSettings;
            })();
    
            api.ClientLibrarySettings = (function() {
    
                /**
                 * Properties of a ClientLibrarySettings.
                 * @memberof google.api
                 * @interface IClientLibrarySettings
                 * @property {string|null} [version] ClientLibrarySettings version
                 * @property {google.api.LaunchStage|null} [launchStage] ClientLibrarySettings launchStage
                 * @property {boolean|null} [restNumericEnums] ClientLibrarySettings restNumericEnums
                 * @property {google.api.IJavaSettings|null} [javaSettings] ClientLibrarySettings javaSettings
                 * @property {google.api.ICppSettings|null} [cppSettings] ClientLibrarySettings cppSettings
                 * @property {google.api.IPhpSettings|null} [phpSettings] ClientLibrarySettings phpSettings
                 * @property {google.api.IPythonSettings|null} [pythonSettings] ClientLibrarySettings pythonSettings
                 * @property {google.api.INodeSettings|null} [nodeSettings] ClientLibrarySettings nodeSettings
                 * @property {google.api.IDotnetSettings|null} [dotnetSettings] ClientLibrarySettings dotnetSettings
                 * @property {google.api.IRubySettings|null} [rubySettings] ClientLibrarySettings rubySettings
                 * @property {google.api.IGoSettings|null} [goSettings] ClientLibrarySettings goSettings
                 */
    
                /**
                 * Constructs a new ClientLibrarySettings.
                 * @memberof google.api
                 * @classdesc Represents a ClientLibrarySettings.
                 * @implements IClientLibrarySettings
                 * @constructor
                 * @param {google.api.IClientLibrarySettings=} [properties] Properties to set
                 */
                function ClientLibrarySettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ClientLibrarySettings version.
                 * @member {string} version
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.version = "";
    
                /**
                 * ClientLibrarySettings launchStage.
                 * @member {google.api.LaunchStage} launchStage
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.launchStage = 0;
    
                /**
                 * ClientLibrarySettings restNumericEnums.
                 * @member {boolean} restNumericEnums
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.restNumericEnums = false;
    
                /**
                 * ClientLibrarySettings javaSettings.
                 * @member {google.api.IJavaSettings|null|undefined} javaSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.javaSettings = null;
    
                /**
                 * ClientLibrarySettings cppSettings.
                 * @member {google.api.ICppSettings|null|undefined} cppSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.cppSettings = null;
    
                /**
                 * ClientLibrarySettings phpSettings.
                 * @member {google.api.IPhpSettings|null|undefined} phpSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.phpSettings = null;
    
                /**
                 * ClientLibrarySettings pythonSettings.
                 * @member {google.api.IPythonSettings|null|undefined} pythonSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.pythonSettings = null;
    
                /**
                 * ClientLibrarySettings nodeSettings.
                 * @member {google.api.INodeSettings|null|undefined} nodeSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.nodeSettings = null;
    
                /**
                 * ClientLibrarySettings dotnetSettings.
                 * @member {google.api.IDotnetSettings|null|undefined} dotnetSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.dotnetSettings = null;
    
                /**
                 * ClientLibrarySettings rubySettings.
                 * @member {google.api.IRubySettings|null|undefined} rubySettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.rubySettings = null;
    
                /**
                 * ClientLibrarySettings goSettings.
                 * @member {google.api.IGoSettings|null|undefined} goSettings
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 */
                ClientLibrarySettings.prototype.goSettings = null;
    
                /**
                 * Creates a new ClientLibrarySettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {google.api.IClientLibrarySettings=} [properties] Properties to set
                 * @returns {google.api.ClientLibrarySettings} ClientLibrarySettings instance
                 */
                ClientLibrarySettings.create = function create(properties) {
                    return new ClientLibrarySettings(properties);
                };
    
                /**
                 * Encodes the specified ClientLibrarySettings message. Does not implicitly {@link google.api.ClientLibrarySettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {google.api.IClientLibrarySettings} message ClientLibrarySettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ClientLibrarySettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.version);
                    if (message.launchStage != null && Object.hasOwnProperty.call(message, "launchStage"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.launchStage);
                    if (message.restNumericEnums != null && Object.hasOwnProperty.call(message, "restNumericEnums"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.restNumericEnums);
                    if (message.javaSettings != null && Object.hasOwnProperty.call(message, "javaSettings"))
                        $root.google.api.JavaSettings.encode(message.javaSettings, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim();
                    if (message.cppSettings != null && Object.hasOwnProperty.call(message, "cppSettings"))
                        $root.google.api.CppSettings.encode(message.cppSettings, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();
                    if (message.phpSettings != null && Object.hasOwnProperty.call(message, "phpSettings"))
                        $root.google.api.PhpSettings.encode(message.phpSettings, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();
                    if (message.pythonSettings != null && Object.hasOwnProperty.call(message, "pythonSettings"))
                        $root.google.api.PythonSettings.encode(message.pythonSettings, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim();
                    if (message.nodeSettings != null && Object.hasOwnProperty.call(message, "nodeSettings"))
                        $root.google.api.NodeSettings.encode(message.nodeSettings, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim();
                    if (message.dotnetSettings != null && Object.hasOwnProperty.call(message, "dotnetSettings"))
                        $root.google.api.DotnetSettings.encode(message.dotnetSettings, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim();
                    if (message.rubySettings != null && Object.hasOwnProperty.call(message, "rubySettings"))
                        $root.google.api.RubySettings.encode(message.rubySettings, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim();
                    if (message.goSettings != null && Object.hasOwnProperty.call(message, "goSettings"))
                        $root.google.api.GoSettings.encode(message.goSettings, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ClientLibrarySettings message, length delimited. Does not implicitly {@link google.api.ClientLibrarySettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {google.api.IClientLibrarySettings} message ClientLibrarySettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ClientLibrarySettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ClientLibrarySettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.ClientLibrarySettings} ClientLibrarySettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ClientLibrarySettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.ClientLibrarySettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.version = reader.string();
                                break;
                            }
                        case 2: {
                                message.launchStage = reader.int32();
                                break;
                            }
                        case 3: {
                                message.restNumericEnums = reader.bool();
                                break;
                            }
                        case 21: {
                                message.javaSettings = $root.google.api.JavaSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 22: {
                                message.cppSettings = $root.google.api.CppSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 23: {
                                message.phpSettings = $root.google.api.PhpSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 24: {
                                message.pythonSettings = $root.google.api.PythonSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 25: {
                                message.nodeSettings = $root.google.api.NodeSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 26: {
                                message.dotnetSettings = $root.google.api.DotnetSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 27: {
                                message.rubySettings = $root.google.api.RubySettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 28: {
                                message.goSettings = $root.google.api.GoSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ClientLibrarySettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.ClientLibrarySettings} ClientLibrarySettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ClientLibrarySettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ClientLibrarySettings message.
                 * @function verify
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ClientLibrarySettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.version != null && message.hasOwnProperty("version"))
                        if (!$util.isString(message.version))
                            return "version: string expected";
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        switch (message.launchStage) {
                        default:
                            return "launchStage: enum value expected";
                        case 0:
                        case 6:
                        case 7:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                            break;
                        }
                    if (message.restNumericEnums != null && message.hasOwnProperty("restNumericEnums"))
                        if (typeof message.restNumericEnums !== "boolean")
                            return "restNumericEnums: boolean expected";
                    if (message.javaSettings != null && message.hasOwnProperty("javaSettings")) {
                        var error = $root.google.api.JavaSettings.verify(message.javaSettings);
                        if (error)
                            return "javaSettings." + error;
                    }
                    if (message.cppSettings != null && message.hasOwnProperty("cppSettings")) {
                        var error = $root.google.api.CppSettings.verify(message.cppSettings);
                        if (error)
                            return "cppSettings." + error;
                    }
                    if (message.phpSettings != null && message.hasOwnProperty("phpSettings")) {
                        var error = $root.google.api.PhpSettings.verify(message.phpSettings);
                        if (error)
                            return "phpSettings." + error;
                    }
                    if (message.pythonSettings != null && message.hasOwnProperty("pythonSettings")) {
                        var error = $root.google.api.PythonSettings.verify(message.pythonSettings);
                        if (error)
                            return "pythonSettings." + error;
                    }
                    if (message.nodeSettings != null && message.hasOwnProperty("nodeSettings")) {
                        var error = $root.google.api.NodeSettings.verify(message.nodeSettings);
                        if (error)
                            return "nodeSettings." + error;
                    }
                    if (message.dotnetSettings != null && message.hasOwnProperty("dotnetSettings")) {
                        var error = $root.google.api.DotnetSettings.verify(message.dotnetSettings);
                        if (error)
                            return "dotnetSettings." + error;
                    }
                    if (message.rubySettings != null && message.hasOwnProperty("rubySettings")) {
                        var error = $root.google.api.RubySettings.verify(message.rubySettings);
                        if (error)
                            return "rubySettings." + error;
                    }
                    if (message.goSettings != null && message.hasOwnProperty("goSettings")) {
                        var error = $root.google.api.GoSettings.verify(message.goSettings);
                        if (error)
                            return "goSettings." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a ClientLibrarySettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.ClientLibrarySettings} ClientLibrarySettings
                 */
                ClientLibrarySettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.ClientLibrarySettings)
                        return object;
                    var message = new $root.google.api.ClientLibrarySettings();
                    if (object.version != null)
                        message.version = String(object.version);
                    switch (object.launchStage) {
                    default:
                        if (typeof object.launchStage === "number") {
                            message.launchStage = object.launchStage;
                            break;
                        }
                        break;
                    case "LAUNCH_STAGE_UNSPECIFIED":
                    case 0:
                        message.launchStage = 0;
                        break;
                    case "UNIMPLEMENTED":
                    case 6:
                        message.launchStage = 6;
                        break;
                    case "PRELAUNCH":
                    case 7:
                        message.launchStage = 7;
                        break;
                    case "EARLY_ACCESS":
                    case 1:
                        message.launchStage = 1;
                        break;
                    case "ALPHA":
                    case 2:
                        message.launchStage = 2;
                        break;
                    case "BETA":
                    case 3:
                        message.launchStage = 3;
                        break;
                    case "GA":
                    case 4:
                        message.launchStage = 4;
                        break;
                    case "DEPRECATED":
                    case 5:
                        message.launchStage = 5;
                        break;
                    }
                    if (object.restNumericEnums != null)
                        message.restNumericEnums = Boolean(object.restNumericEnums);
                    if (object.javaSettings != null) {
                        if (typeof object.javaSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.javaSettings: object expected");
                        message.javaSettings = $root.google.api.JavaSettings.fromObject(object.javaSettings);
                    }
                    if (object.cppSettings != null) {
                        if (typeof object.cppSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.cppSettings: object expected");
                        message.cppSettings = $root.google.api.CppSettings.fromObject(object.cppSettings);
                    }
                    if (object.phpSettings != null) {
                        if (typeof object.phpSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.phpSettings: object expected");
                        message.phpSettings = $root.google.api.PhpSettings.fromObject(object.phpSettings);
                    }
                    if (object.pythonSettings != null) {
                        if (typeof object.pythonSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.pythonSettings: object expected");
                        message.pythonSettings = $root.google.api.PythonSettings.fromObject(object.pythonSettings);
                    }
                    if (object.nodeSettings != null) {
                        if (typeof object.nodeSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.nodeSettings: object expected");
                        message.nodeSettings = $root.google.api.NodeSettings.fromObject(object.nodeSettings);
                    }
                    if (object.dotnetSettings != null) {
                        if (typeof object.dotnetSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.dotnetSettings: object expected");
                        message.dotnetSettings = $root.google.api.DotnetSettings.fromObject(object.dotnetSettings);
                    }
                    if (object.rubySettings != null) {
                        if (typeof object.rubySettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.rubySettings: object expected");
                        message.rubySettings = $root.google.api.RubySettings.fromObject(object.rubySettings);
                    }
                    if (object.goSettings != null) {
                        if (typeof object.goSettings !== "object")
                            throw TypeError(".google.api.ClientLibrarySettings.goSettings: object expected");
                        message.goSettings = $root.google.api.GoSettings.fromObject(object.goSettings);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ClientLibrarySettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {google.api.ClientLibrarySettings} message ClientLibrarySettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ClientLibrarySettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.version = "";
                        object.launchStage = options.enums === String ? "LAUNCH_STAGE_UNSPECIFIED" : 0;
                        object.restNumericEnums = false;
                        object.javaSettings = null;
                        object.cppSettings = null;
                        object.phpSettings = null;
                        object.pythonSettings = null;
                        object.nodeSettings = null;
                        object.dotnetSettings = null;
                        object.rubySettings = null;
                        object.goSettings = null;
                    }
                    if (message.version != null && message.hasOwnProperty("version"))
                        object.version = message.version;
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        object.launchStage = options.enums === String ? $root.google.api.LaunchStage[message.launchStage] === undefined ? message.launchStage : $root.google.api.LaunchStage[message.launchStage] : message.launchStage;
                    if (message.restNumericEnums != null && message.hasOwnProperty("restNumericEnums"))
                        object.restNumericEnums = message.restNumericEnums;
                    if (message.javaSettings != null && message.hasOwnProperty("javaSettings"))
                        object.javaSettings = $root.google.api.JavaSettings.toObject(message.javaSettings, options);
                    if (message.cppSettings != null && message.hasOwnProperty("cppSettings"))
                        object.cppSettings = $root.google.api.CppSettings.toObject(message.cppSettings, options);
                    if (message.phpSettings != null && message.hasOwnProperty("phpSettings"))
                        object.phpSettings = $root.google.api.PhpSettings.toObject(message.phpSettings, options);
                    if (message.pythonSettings != null && message.hasOwnProperty("pythonSettings"))
                        object.pythonSettings = $root.google.api.PythonSettings.toObject(message.pythonSettings, options);
                    if (message.nodeSettings != null && message.hasOwnProperty("nodeSettings"))
                        object.nodeSettings = $root.google.api.NodeSettings.toObject(message.nodeSettings, options);
                    if (message.dotnetSettings != null && message.hasOwnProperty("dotnetSettings"))
                        object.dotnetSettings = $root.google.api.DotnetSettings.toObject(message.dotnetSettings, options);
                    if (message.rubySettings != null && message.hasOwnProperty("rubySettings"))
                        object.rubySettings = $root.google.api.RubySettings.toObject(message.rubySettings, options);
                    if (message.goSettings != null && message.hasOwnProperty("goSettings"))
                        object.goSettings = $root.google.api.GoSettings.toObject(message.goSettings, options);
                    return object;
                };
    
                /**
                 * Converts this ClientLibrarySettings to JSON.
                 * @function toJSON
                 * @memberof google.api.ClientLibrarySettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ClientLibrarySettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ClientLibrarySettings
                 * @function getTypeUrl
                 * @memberof google.api.ClientLibrarySettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ClientLibrarySettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.ClientLibrarySettings";
                };
    
                return ClientLibrarySettings;
            })();
    
            api.Publishing = (function() {
    
                /**
                 * Properties of a Publishing.
                 * @memberof google.api
                 * @interface IPublishing
                 * @property {Array.<google.api.IMethodSettings>|null} [methodSettings] Publishing methodSettings
                 * @property {string|null} [newIssueUri] Publishing newIssueUri
                 * @property {string|null} [documentationUri] Publishing documentationUri
                 * @property {string|null} [apiShortName] Publishing apiShortName
                 * @property {string|null} [githubLabel] Publishing githubLabel
                 * @property {Array.<string>|null} [codeownerGithubTeams] Publishing codeownerGithubTeams
                 * @property {string|null} [docTagPrefix] Publishing docTagPrefix
                 * @property {google.api.ClientLibraryOrganization|null} [organization] Publishing organization
                 * @property {Array.<google.api.IClientLibrarySettings>|null} [librarySettings] Publishing librarySettings
                 * @property {string|null} [protoReferenceDocumentationUri] Publishing protoReferenceDocumentationUri
                 * @property {string|null} [restReferenceDocumentationUri] Publishing restReferenceDocumentationUri
                 */
    
                /**
                 * Constructs a new Publishing.
                 * @memberof google.api
                 * @classdesc Represents a Publishing.
                 * @implements IPublishing
                 * @constructor
                 * @param {google.api.IPublishing=} [properties] Properties to set
                 */
                function Publishing(properties) {
                    this.methodSettings = [];
                    this.codeownerGithubTeams = [];
                    this.librarySettings = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Publishing methodSettings.
                 * @member {Array.<google.api.IMethodSettings>} methodSettings
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.methodSettings = $util.emptyArray;
    
                /**
                 * Publishing newIssueUri.
                 * @member {string} newIssueUri
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.newIssueUri = "";
    
                /**
                 * Publishing documentationUri.
                 * @member {string} documentationUri
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.documentationUri = "";
    
                /**
                 * Publishing apiShortName.
                 * @member {string} apiShortName
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.apiShortName = "";
    
                /**
                 * Publishing githubLabel.
                 * @member {string} githubLabel
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.githubLabel = "";
    
                /**
                 * Publishing codeownerGithubTeams.
                 * @member {Array.<string>} codeownerGithubTeams
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.codeownerGithubTeams = $util.emptyArray;
    
                /**
                 * Publishing docTagPrefix.
                 * @member {string} docTagPrefix
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.docTagPrefix = "";
    
                /**
                 * Publishing organization.
                 * @member {google.api.ClientLibraryOrganization} organization
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.organization = 0;
    
                /**
                 * Publishing librarySettings.
                 * @member {Array.<google.api.IClientLibrarySettings>} librarySettings
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.librarySettings = $util.emptyArray;
    
                /**
                 * Publishing protoReferenceDocumentationUri.
                 * @member {string} protoReferenceDocumentationUri
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.protoReferenceDocumentationUri = "";
    
                /**
                 * Publishing restReferenceDocumentationUri.
                 * @member {string} restReferenceDocumentationUri
                 * @memberof google.api.Publishing
                 * @instance
                 */
                Publishing.prototype.restReferenceDocumentationUri = "";
    
                /**
                 * Creates a new Publishing instance using the specified properties.
                 * @function create
                 * @memberof google.api.Publishing
                 * @static
                 * @param {google.api.IPublishing=} [properties] Properties to set
                 * @returns {google.api.Publishing} Publishing instance
                 */
                Publishing.create = function create(properties) {
                    return new Publishing(properties);
                };
    
                /**
                 * Encodes the specified Publishing message. Does not implicitly {@link google.api.Publishing.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.Publishing
                 * @static
                 * @param {google.api.IPublishing} message Publishing message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Publishing.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.methodSettings != null && message.methodSettings.length)
                        for (var i = 0; i < message.methodSettings.length; ++i)
                            $root.google.api.MethodSettings.encode(message.methodSettings[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.newIssueUri != null && Object.hasOwnProperty.call(message, "newIssueUri"))
                        writer.uint32(/* id 101, wireType 2 =*/810).string(message.newIssueUri);
                    if (message.documentationUri != null && Object.hasOwnProperty.call(message, "documentationUri"))
                        writer.uint32(/* id 102, wireType 2 =*/818).string(message.documentationUri);
                    if (message.apiShortName != null && Object.hasOwnProperty.call(message, "apiShortName"))
                        writer.uint32(/* id 103, wireType 2 =*/826).string(message.apiShortName);
                    if (message.githubLabel != null && Object.hasOwnProperty.call(message, "githubLabel"))
                        writer.uint32(/* id 104, wireType 2 =*/834).string(message.githubLabel);
                    if (message.codeownerGithubTeams != null && message.codeownerGithubTeams.length)
                        for (var i = 0; i < message.codeownerGithubTeams.length; ++i)
                            writer.uint32(/* id 105, wireType 2 =*/842).string(message.codeownerGithubTeams[i]);
                    if (message.docTagPrefix != null && Object.hasOwnProperty.call(message, "docTagPrefix"))
                        writer.uint32(/* id 106, wireType 2 =*/850).string(message.docTagPrefix);
                    if (message.organization != null && Object.hasOwnProperty.call(message, "organization"))
                        writer.uint32(/* id 107, wireType 0 =*/856).int32(message.organization);
                    if (message.librarySettings != null && message.librarySettings.length)
                        for (var i = 0; i < message.librarySettings.length; ++i)
                            $root.google.api.ClientLibrarySettings.encode(message.librarySettings[i], writer.uint32(/* id 109, wireType 2 =*/874).fork()).ldelim();
                    if (message.protoReferenceDocumentationUri != null && Object.hasOwnProperty.call(message, "protoReferenceDocumentationUri"))
                        writer.uint32(/* id 110, wireType 2 =*/882).string(message.protoReferenceDocumentationUri);
                    if (message.restReferenceDocumentationUri != null && Object.hasOwnProperty.call(message, "restReferenceDocumentationUri"))
                        writer.uint32(/* id 111, wireType 2 =*/890).string(message.restReferenceDocumentationUri);
                    return writer;
                };
    
                /**
                 * Encodes the specified Publishing message, length delimited. Does not implicitly {@link google.api.Publishing.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.Publishing
                 * @static
                 * @param {google.api.IPublishing} message Publishing message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Publishing.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Publishing message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.Publishing
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.Publishing} Publishing
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Publishing.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Publishing();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 2: {
                                if (!(message.methodSettings && message.methodSettings.length))
                                    message.methodSettings = [];
                                message.methodSettings.push($root.google.api.MethodSettings.decode(reader, reader.uint32()));
                                break;
                            }
                        case 101: {
                                message.newIssueUri = reader.string();
                                break;
                            }
                        case 102: {
                                message.documentationUri = reader.string();
                                break;
                            }
                        case 103: {
                                message.apiShortName = reader.string();
                                break;
                            }
                        case 104: {
                                message.githubLabel = reader.string();
                                break;
                            }
                        case 105: {
                                if (!(message.codeownerGithubTeams && message.codeownerGithubTeams.length))
                                    message.codeownerGithubTeams = [];
                                message.codeownerGithubTeams.push(reader.string());
                                break;
                            }
                        case 106: {
                                message.docTagPrefix = reader.string();
                                break;
                            }
                        case 107: {
                                message.organization = reader.int32();
                                break;
                            }
                        case 109: {
                                if (!(message.librarySettings && message.librarySettings.length))
                                    message.librarySettings = [];
                                message.librarySettings.push($root.google.api.ClientLibrarySettings.decode(reader, reader.uint32()));
                                break;
                            }
                        case 110: {
                                message.protoReferenceDocumentationUri = reader.string();
                                break;
                            }
                        case 111: {
                                message.restReferenceDocumentationUri = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Publishing message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.Publishing
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.Publishing} Publishing
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Publishing.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Publishing message.
                 * @function verify
                 * @memberof google.api.Publishing
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Publishing.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.methodSettings != null && message.hasOwnProperty("methodSettings")) {
                        if (!Array.isArray(message.methodSettings))
                            return "methodSettings: array expected";
                        for (var i = 0; i < message.methodSettings.length; ++i) {
                            var error = $root.google.api.MethodSettings.verify(message.methodSettings[i]);
                            if (error)
                                return "methodSettings." + error;
                        }
                    }
                    if (message.newIssueUri != null && message.hasOwnProperty("newIssueUri"))
                        if (!$util.isString(message.newIssueUri))
                            return "newIssueUri: string expected";
                    if (message.documentationUri != null && message.hasOwnProperty("documentationUri"))
                        if (!$util.isString(message.documentationUri))
                            return "documentationUri: string expected";
                    if (message.apiShortName != null && message.hasOwnProperty("apiShortName"))
                        if (!$util.isString(message.apiShortName))
                            return "apiShortName: string expected";
                    if (message.githubLabel != null && message.hasOwnProperty("githubLabel"))
                        if (!$util.isString(message.githubLabel))
                            return "githubLabel: string expected";
                    if (message.codeownerGithubTeams != null && message.hasOwnProperty("codeownerGithubTeams")) {
                        if (!Array.isArray(message.codeownerGithubTeams))
                            return "codeownerGithubTeams: array expected";
                        for (var i = 0; i < message.codeownerGithubTeams.length; ++i)
                            if (!$util.isString(message.codeownerGithubTeams[i]))
                                return "codeownerGithubTeams: string[] expected";
                    }
                    if (message.docTagPrefix != null && message.hasOwnProperty("docTagPrefix"))
                        if (!$util.isString(message.docTagPrefix))
                            return "docTagPrefix: string expected";
                    if (message.organization != null && message.hasOwnProperty("organization"))
                        switch (message.organization) {
                        default:
                            return "organization: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                            break;
                        }
                    if (message.librarySettings != null && message.hasOwnProperty("librarySettings")) {
                        if (!Array.isArray(message.librarySettings))
                            return "librarySettings: array expected";
                        for (var i = 0; i < message.librarySettings.length; ++i) {
                            var error = $root.google.api.ClientLibrarySettings.verify(message.librarySettings[i]);
                            if (error)
                                return "librarySettings." + error;
                        }
                    }
                    if (message.protoReferenceDocumentationUri != null && message.hasOwnProperty("protoReferenceDocumentationUri"))
                        if (!$util.isString(message.protoReferenceDocumentationUri))
                            return "protoReferenceDocumentationUri: string expected";
                    if (message.restReferenceDocumentationUri != null && message.hasOwnProperty("restReferenceDocumentationUri"))
                        if (!$util.isString(message.restReferenceDocumentationUri))
                            return "restReferenceDocumentationUri: string expected";
                    return null;
                };
    
                /**
                 * Creates a Publishing message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.Publishing
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.Publishing} Publishing
                 */
                Publishing.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.Publishing)
                        return object;
                    var message = new $root.google.api.Publishing();
                    if (object.methodSettings) {
                        if (!Array.isArray(object.methodSettings))
                            throw TypeError(".google.api.Publishing.methodSettings: array expected");
                        message.methodSettings = [];
                        for (var i = 0; i < object.methodSettings.length; ++i) {
                            if (typeof object.methodSettings[i] !== "object")
                                throw TypeError(".google.api.Publishing.methodSettings: object expected");
                            message.methodSettings[i] = $root.google.api.MethodSettings.fromObject(object.methodSettings[i]);
                        }
                    }
                    if (object.newIssueUri != null)
                        message.newIssueUri = String(object.newIssueUri);
                    if (object.documentationUri != null)
                        message.documentationUri = String(object.documentationUri);
                    if (object.apiShortName != null)
                        message.apiShortName = String(object.apiShortName);
                    if (object.githubLabel != null)
                        message.githubLabel = String(object.githubLabel);
                    if (object.codeownerGithubTeams) {
                        if (!Array.isArray(object.codeownerGithubTeams))
                            throw TypeError(".google.api.Publishing.codeownerGithubTeams: array expected");
                        message.codeownerGithubTeams = [];
                        for (var i = 0; i < object.codeownerGithubTeams.length; ++i)
                            message.codeownerGithubTeams[i] = String(object.codeownerGithubTeams[i]);
                    }
                    if (object.docTagPrefix != null)
                        message.docTagPrefix = String(object.docTagPrefix);
                    switch (object.organization) {
                    default:
                        if (typeof object.organization === "number") {
                            message.organization = object.organization;
                            break;
                        }
                        break;
                    case "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED":
                    case 0:
                        message.organization = 0;
                        break;
                    case "CLOUD":
                    case 1:
                        message.organization = 1;
                        break;
                    case "ADS":
                    case 2:
                        message.organization = 2;
                        break;
                    case "PHOTOS":
                    case 3:
                        message.organization = 3;
                        break;
                    case "STREET_VIEW":
                    case 4:
                        message.organization = 4;
                        break;
                    case "SHOPPING":
                    case 5:
                        message.organization = 5;
                        break;
                    case "GEO":
                    case 6:
                        message.organization = 6;
                        break;
                    case "GENERATIVE_AI":
                    case 7:
                        message.organization = 7;
                        break;
                    }
                    if (object.librarySettings) {
                        if (!Array.isArray(object.librarySettings))
                            throw TypeError(".google.api.Publishing.librarySettings: array expected");
                        message.librarySettings = [];
                        for (var i = 0; i < object.librarySettings.length; ++i) {
                            if (typeof object.librarySettings[i] !== "object")
                                throw TypeError(".google.api.Publishing.librarySettings: object expected");
                            message.librarySettings[i] = $root.google.api.ClientLibrarySettings.fromObject(object.librarySettings[i]);
                        }
                    }
                    if (object.protoReferenceDocumentationUri != null)
                        message.protoReferenceDocumentationUri = String(object.protoReferenceDocumentationUri);
                    if (object.restReferenceDocumentationUri != null)
                        message.restReferenceDocumentationUri = String(object.restReferenceDocumentationUri);
                    return message;
                };
    
                /**
                 * Creates a plain object from a Publishing message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.Publishing
                 * @static
                 * @param {google.api.Publishing} message Publishing
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Publishing.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.methodSettings = [];
                        object.codeownerGithubTeams = [];
                        object.librarySettings = [];
                    }
                    if (options.defaults) {
                        object.newIssueUri = "";
                        object.documentationUri = "";
                        object.apiShortName = "";
                        object.githubLabel = "";
                        object.docTagPrefix = "";
                        object.organization = options.enums === String ? "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED" : 0;
                        object.protoReferenceDocumentationUri = "";
                        object.restReferenceDocumentationUri = "";
                    }
                    if (message.methodSettings && message.methodSettings.length) {
                        object.methodSettings = [];
                        for (var j = 0; j < message.methodSettings.length; ++j)
                            object.methodSettings[j] = $root.google.api.MethodSettings.toObject(message.methodSettings[j], options);
                    }
                    if (message.newIssueUri != null && message.hasOwnProperty("newIssueUri"))
                        object.newIssueUri = message.newIssueUri;
                    if (message.documentationUri != null && message.hasOwnProperty("documentationUri"))
                        object.documentationUri = message.documentationUri;
                    if (message.apiShortName != null && message.hasOwnProperty("apiShortName"))
                        object.apiShortName = message.apiShortName;
                    if (message.githubLabel != null && message.hasOwnProperty("githubLabel"))
                        object.githubLabel = message.githubLabel;
                    if (message.codeownerGithubTeams && message.codeownerGithubTeams.length) {
                        object.codeownerGithubTeams = [];
                        for (var j = 0; j < message.codeownerGithubTeams.length; ++j)
                            object.codeownerGithubTeams[j] = message.codeownerGithubTeams[j];
                    }
                    if (message.docTagPrefix != null && message.hasOwnProperty("docTagPrefix"))
                        object.docTagPrefix = message.docTagPrefix;
                    if (message.organization != null && message.hasOwnProperty("organization"))
                        object.organization = options.enums === String ? $root.google.api.ClientLibraryOrganization[message.organization] === undefined ? message.organization : $root.google.api.ClientLibraryOrganization[message.organization] : message.organization;
                    if (message.librarySettings && message.librarySettings.length) {
                        object.librarySettings = [];
                        for (var j = 0; j < message.librarySettings.length; ++j)
                            object.librarySettings[j] = $root.google.api.ClientLibrarySettings.toObject(message.librarySettings[j], options);
                    }
                    if (message.protoReferenceDocumentationUri != null && message.hasOwnProperty("protoReferenceDocumentationUri"))
                        object.protoReferenceDocumentationUri = message.protoReferenceDocumentationUri;
                    if (message.restReferenceDocumentationUri != null && message.hasOwnProperty("restReferenceDocumentationUri"))
                        object.restReferenceDocumentationUri = message.restReferenceDocumentationUri;
                    return object;
                };
    
                /**
                 * Converts this Publishing to JSON.
                 * @function toJSON
                 * @memberof google.api.Publishing
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Publishing.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Publishing
                 * @function getTypeUrl
                 * @memberof google.api.Publishing
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Publishing.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.Publishing";
                };
    
                return Publishing;
            })();
    
            api.JavaSettings = (function() {
    
                /**
                 * Properties of a JavaSettings.
                 * @memberof google.api
                 * @interface IJavaSettings
                 * @property {string|null} [libraryPackage] JavaSettings libraryPackage
                 * @property {Object.<string,string>|null} [serviceClassNames] JavaSettings serviceClassNames
                 * @property {google.api.ICommonLanguageSettings|null} [common] JavaSettings common
                 */
    
                /**
                 * Constructs a new JavaSettings.
                 * @memberof google.api
                 * @classdesc Represents a JavaSettings.
                 * @implements IJavaSettings
                 * @constructor
                 * @param {google.api.IJavaSettings=} [properties] Properties to set
                 */
                function JavaSettings(properties) {
                    this.serviceClassNames = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * JavaSettings libraryPackage.
                 * @member {string} libraryPackage
                 * @memberof google.api.JavaSettings
                 * @instance
                 */
                JavaSettings.prototype.libraryPackage = "";
    
                /**
                 * JavaSettings serviceClassNames.
                 * @member {Object.<string,string>} serviceClassNames
                 * @memberof google.api.JavaSettings
                 * @instance
                 */
                JavaSettings.prototype.serviceClassNames = $util.emptyObject;
    
                /**
                 * JavaSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.JavaSettings
                 * @instance
                 */
                JavaSettings.prototype.common = null;
    
                /**
                 * Creates a new JavaSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {google.api.IJavaSettings=} [properties] Properties to set
                 * @returns {google.api.JavaSettings} JavaSettings instance
                 */
                JavaSettings.create = function create(properties) {
                    return new JavaSettings(properties);
                };
    
                /**
                 * Encodes the specified JavaSettings message. Does not implicitly {@link google.api.JavaSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {google.api.IJavaSettings} message JavaSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                JavaSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.libraryPackage != null && Object.hasOwnProperty.call(message, "libraryPackage"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.libraryPackage);
                    if (message.serviceClassNames != null && Object.hasOwnProperty.call(message, "serviceClassNames"))
                        for (var keys = Object.keys(message.serviceClassNames), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.serviceClassNames[keys[i]]).ldelim();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified JavaSettings message, length delimited. Does not implicitly {@link google.api.JavaSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {google.api.IJavaSettings} message JavaSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                JavaSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a JavaSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.JavaSettings} JavaSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                JavaSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.JavaSettings(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.libraryPackage = reader.string();
                                break;
                            }
                        case 2: {
                                if (message.serviceClassNames === $util.emptyObject)
                                    message.serviceClassNames = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.serviceClassNames[key] = value;
                                break;
                            }
                        case 3: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a JavaSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.JavaSettings} JavaSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                JavaSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a JavaSettings message.
                 * @function verify
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                JavaSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.libraryPackage != null && message.hasOwnProperty("libraryPackage"))
                        if (!$util.isString(message.libraryPackage))
                            return "libraryPackage: string expected";
                    if (message.serviceClassNames != null && message.hasOwnProperty("serviceClassNames")) {
                        if (!$util.isObject(message.serviceClassNames))
                            return "serviceClassNames: object expected";
                        var key = Object.keys(message.serviceClassNames);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.serviceClassNames[key[i]]))
                                return "serviceClassNames: string{k:string} expected";
                    }
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a JavaSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.JavaSettings} JavaSettings
                 */
                JavaSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.JavaSettings)
                        return object;
                    var message = new $root.google.api.JavaSettings();
                    if (object.libraryPackage != null)
                        message.libraryPackage = String(object.libraryPackage);
                    if (object.serviceClassNames) {
                        if (typeof object.serviceClassNames !== "object")
                            throw TypeError(".google.api.JavaSettings.serviceClassNames: object expected");
                        message.serviceClassNames = {};
                        for (var keys = Object.keys(object.serviceClassNames), i = 0; i < keys.length; ++i)
                            message.serviceClassNames[keys[i]] = String(object.serviceClassNames[keys[i]]);
                    }
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.JavaSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a JavaSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {google.api.JavaSettings} message JavaSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                JavaSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.serviceClassNames = {};
                    if (options.defaults) {
                        object.libraryPackage = "";
                        object.common = null;
                    }
                    if (message.libraryPackage != null && message.hasOwnProperty("libraryPackage"))
                        object.libraryPackage = message.libraryPackage;
                    var keys2;
                    if (message.serviceClassNames && (keys2 = Object.keys(message.serviceClassNames)).length) {
                        object.serviceClassNames = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.serviceClassNames[keys2[j]] = message.serviceClassNames[keys2[j]];
                    }
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    return object;
                };
    
                /**
                 * Converts this JavaSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.JavaSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                JavaSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for JavaSettings
                 * @function getTypeUrl
                 * @memberof google.api.JavaSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                JavaSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.JavaSettings";
                };
    
                return JavaSettings;
            })();
    
            api.CppSettings = (function() {
    
                /**
                 * Properties of a CppSettings.
                 * @memberof google.api
                 * @interface ICppSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] CppSettings common
                 */
    
                /**
                 * Constructs a new CppSettings.
                 * @memberof google.api
                 * @classdesc Represents a CppSettings.
                 * @implements ICppSettings
                 * @constructor
                 * @param {google.api.ICppSettings=} [properties] Properties to set
                 */
                function CppSettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CppSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.CppSettings
                 * @instance
                 */
                CppSettings.prototype.common = null;
    
                /**
                 * Creates a new CppSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {google.api.ICppSettings=} [properties] Properties to set
                 * @returns {google.api.CppSettings} CppSettings instance
                 */
                CppSettings.create = function create(properties) {
                    return new CppSettings(properties);
                };
    
                /**
                 * Encodes the specified CppSettings message. Does not implicitly {@link google.api.CppSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {google.api.ICppSettings} message CppSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CppSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified CppSettings message, length delimited. Does not implicitly {@link google.api.CppSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {google.api.ICppSettings} message CppSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CppSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CppSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.CppSettings} CppSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CppSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.CppSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CppSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.CppSettings} CppSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CppSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CppSettings message.
                 * @function verify
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CppSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a CppSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.CppSettings} CppSettings
                 */
                CppSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.CppSettings)
                        return object;
                    var message = new $root.google.api.CppSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.CppSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a CppSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {google.api.CppSettings} message CppSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CppSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    return object;
                };
    
                /**
                 * Converts this CppSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.CppSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CppSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for CppSettings
                 * @function getTypeUrl
                 * @memberof google.api.CppSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                CppSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.CppSettings";
                };
    
                return CppSettings;
            })();
    
            api.PhpSettings = (function() {
    
                /**
                 * Properties of a PhpSettings.
                 * @memberof google.api
                 * @interface IPhpSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] PhpSettings common
                 */
    
                /**
                 * Constructs a new PhpSettings.
                 * @memberof google.api
                 * @classdesc Represents a PhpSettings.
                 * @implements IPhpSettings
                 * @constructor
                 * @param {google.api.IPhpSettings=} [properties] Properties to set
                 */
                function PhpSettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * PhpSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.PhpSettings
                 * @instance
                 */
                PhpSettings.prototype.common = null;
    
                /**
                 * Creates a new PhpSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {google.api.IPhpSettings=} [properties] Properties to set
                 * @returns {google.api.PhpSettings} PhpSettings instance
                 */
                PhpSettings.create = function create(properties) {
                    return new PhpSettings(properties);
                };
    
                /**
                 * Encodes the specified PhpSettings message. Does not implicitly {@link google.api.PhpSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {google.api.IPhpSettings} message PhpSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PhpSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified PhpSettings message, length delimited. Does not implicitly {@link google.api.PhpSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {google.api.IPhpSettings} message PhpSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PhpSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a PhpSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.PhpSettings} PhpSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PhpSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.PhpSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a PhpSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.PhpSettings} PhpSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PhpSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a PhpSettings message.
                 * @function verify
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                PhpSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a PhpSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.PhpSettings} PhpSettings
                 */
                PhpSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.PhpSettings)
                        return object;
                    var message = new $root.google.api.PhpSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.PhpSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a PhpSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {google.api.PhpSettings} message PhpSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                PhpSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    return object;
                };
    
                /**
                 * Converts this PhpSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.PhpSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                PhpSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for PhpSettings
                 * @function getTypeUrl
                 * @memberof google.api.PhpSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                PhpSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.PhpSettings";
                };
    
                return PhpSettings;
            })();
    
            api.PythonSettings = (function() {
    
                /**
                 * Properties of a PythonSettings.
                 * @memberof google.api
                 * @interface IPythonSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] PythonSettings common
                 * @property {google.api.PythonSettings.IExperimentalFeatures|null} [experimentalFeatures] PythonSettings experimentalFeatures
                 */
    
                /**
                 * Constructs a new PythonSettings.
                 * @memberof google.api
                 * @classdesc Represents a PythonSettings.
                 * @implements IPythonSettings
                 * @constructor
                 * @param {google.api.IPythonSettings=} [properties] Properties to set
                 */
                function PythonSettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * PythonSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.PythonSettings
                 * @instance
                 */
                PythonSettings.prototype.common = null;
    
                /**
                 * PythonSettings experimentalFeatures.
                 * @member {google.api.PythonSettings.IExperimentalFeatures|null|undefined} experimentalFeatures
                 * @memberof google.api.PythonSettings
                 * @instance
                 */
                PythonSettings.prototype.experimentalFeatures = null;
    
                /**
                 * Creates a new PythonSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {google.api.IPythonSettings=} [properties] Properties to set
                 * @returns {google.api.PythonSettings} PythonSettings instance
                 */
                PythonSettings.create = function create(properties) {
                    return new PythonSettings(properties);
                };
    
                /**
                 * Encodes the specified PythonSettings message. Does not implicitly {@link google.api.PythonSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {google.api.IPythonSettings} message PythonSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PythonSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.experimentalFeatures != null && Object.hasOwnProperty.call(message, "experimentalFeatures"))
                        $root.google.api.PythonSettings.ExperimentalFeatures.encode(message.experimentalFeatures, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified PythonSettings message, length delimited. Does not implicitly {@link google.api.PythonSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {google.api.IPythonSettings} message PythonSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                PythonSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a PythonSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.PythonSettings} PythonSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PythonSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.PythonSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 2: {
                                message.experimentalFeatures = $root.google.api.PythonSettings.ExperimentalFeatures.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a PythonSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.PythonSettings} PythonSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                PythonSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a PythonSettings message.
                 * @function verify
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                PythonSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    if (message.experimentalFeatures != null && message.hasOwnProperty("experimentalFeatures")) {
                        var error = $root.google.api.PythonSettings.ExperimentalFeatures.verify(message.experimentalFeatures);
                        if (error)
                            return "experimentalFeatures." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a PythonSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.PythonSettings} PythonSettings
                 */
                PythonSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.PythonSettings)
                        return object;
                    var message = new $root.google.api.PythonSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.PythonSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    if (object.experimentalFeatures != null) {
                        if (typeof object.experimentalFeatures !== "object")
                            throw TypeError(".google.api.PythonSettings.experimentalFeatures: object expected");
                        message.experimentalFeatures = $root.google.api.PythonSettings.ExperimentalFeatures.fromObject(object.experimentalFeatures);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a PythonSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {google.api.PythonSettings} message PythonSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                PythonSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.common = null;
                        object.experimentalFeatures = null;
                    }
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    if (message.experimentalFeatures != null && message.hasOwnProperty("experimentalFeatures"))
                        object.experimentalFeatures = $root.google.api.PythonSettings.ExperimentalFeatures.toObject(message.experimentalFeatures, options);
                    return object;
                };
    
                /**
                 * Converts this PythonSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.PythonSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                PythonSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for PythonSettings
                 * @function getTypeUrl
                 * @memberof google.api.PythonSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                PythonSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.PythonSettings";
                };
    
                PythonSettings.ExperimentalFeatures = (function() {
    
                    /**
                     * Properties of an ExperimentalFeatures.
                     * @memberof google.api.PythonSettings
                     * @interface IExperimentalFeatures
                     * @property {boolean|null} [restAsyncIoEnabled] ExperimentalFeatures restAsyncIoEnabled
                     * @property {boolean|null} [protobufPythonicTypesEnabled] ExperimentalFeatures protobufPythonicTypesEnabled
                     * @property {boolean|null} [unversionedPackageDisabled] ExperimentalFeatures unversionedPackageDisabled
                     */
    
                    /**
                     * Constructs a new ExperimentalFeatures.
                     * @memberof google.api.PythonSettings
                     * @classdesc Represents an ExperimentalFeatures.
                     * @implements IExperimentalFeatures
                     * @constructor
                     * @param {google.api.PythonSettings.IExperimentalFeatures=} [properties] Properties to set
                     */
                    function ExperimentalFeatures(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExperimentalFeatures restAsyncIoEnabled.
                     * @member {boolean} restAsyncIoEnabled
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @instance
                     */
                    ExperimentalFeatures.prototype.restAsyncIoEnabled = false;
    
                    /**
                     * ExperimentalFeatures protobufPythonicTypesEnabled.
                     * @member {boolean} protobufPythonicTypesEnabled
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @instance
                     */
                    ExperimentalFeatures.prototype.protobufPythonicTypesEnabled = false;
    
                    /**
                     * ExperimentalFeatures unversionedPackageDisabled.
                     * @member {boolean} unversionedPackageDisabled
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @instance
                     */
                    ExperimentalFeatures.prototype.unversionedPackageDisabled = false;
    
                    /**
                     * Creates a new ExperimentalFeatures instance using the specified properties.
                     * @function create
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {google.api.PythonSettings.IExperimentalFeatures=} [properties] Properties to set
                     * @returns {google.api.PythonSettings.ExperimentalFeatures} ExperimentalFeatures instance
                     */
                    ExperimentalFeatures.create = function create(properties) {
                        return new ExperimentalFeatures(properties);
                    };
    
                    /**
                     * Encodes the specified ExperimentalFeatures message. Does not implicitly {@link google.api.PythonSettings.ExperimentalFeatures.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {google.api.PythonSettings.IExperimentalFeatures} message ExperimentalFeatures message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExperimentalFeatures.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.restAsyncIoEnabled != null && Object.hasOwnProperty.call(message, "restAsyncIoEnabled"))
                            writer.uint32(/* id 1, wireType 0 =*/8).bool(message.restAsyncIoEnabled);
                        if (message.protobufPythonicTypesEnabled != null && Object.hasOwnProperty.call(message, "protobufPythonicTypesEnabled"))
                            writer.uint32(/* id 2, wireType 0 =*/16).bool(message.protobufPythonicTypesEnabled);
                        if (message.unversionedPackageDisabled != null && Object.hasOwnProperty.call(message, "unversionedPackageDisabled"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.unversionedPackageDisabled);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExperimentalFeatures message, length delimited. Does not implicitly {@link google.api.PythonSettings.ExperimentalFeatures.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {google.api.PythonSettings.IExperimentalFeatures} message ExperimentalFeatures message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExperimentalFeatures.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExperimentalFeatures message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.PythonSettings.ExperimentalFeatures} ExperimentalFeatures
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExperimentalFeatures.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.PythonSettings.ExperimentalFeatures();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.restAsyncIoEnabled = reader.bool();
                                    break;
                                }
                            case 2: {
                                    message.protobufPythonicTypesEnabled = reader.bool();
                                    break;
                                }
                            case 3: {
                                    message.unversionedPackageDisabled = reader.bool();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExperimentalFeatures message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.PythonSettings.ExperimentalFeatures} ExperimentalFeatures
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExperimentalFeatures.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExperimentalFeatures message.
                     * @function verify
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExperimentalFeatures.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.restAsyncIoEnabled != null && message.hasOwnProperty("restAsyncIoEnabled"))
                            if (typeof message.restAsyncIoEnabled !== "boolean")
                                return "restAsyncIoEnabled: boolean expected";
                        if (message.protobufPythonicTypesEnabled != null && message.hasOwnProperty("protobufPythonicTypesEnabled"))
                            if (typeof message.protobufPythonicTypesEnabled !== "boolean")
                                return "protobufPythonicTypesEnabled: boolean expected";
                        if (message.unversionedPackageDisabled != null && message.hasOwnProperty("unversionedPackageDisabled"))
                            if (typeof message.unversionedPackageDisabled !== "boolean")
                                return "unversionedPackageDisabled: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates an ExperimentalFeatures message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.PythonSettings.ExperimentalFeatures} ExperimentalFeatures
                     */
                    ExperimentalFeatures.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.PythonSettings.ExperimentalFeatures)
                            return object;
                        var message = new $root.google.api.PythonSettings.ExperimentalFeatures();
                        if (object.restAsyncIoEnabled != null)
                            message.restAsyncIoEnabled = Boolean(object.restAsyncIoEnabled);
                        if (object.protobufPythonicTypesEnabled != null)
                            message.protobufPythonicTypesEnabled = Boolean(object.protobufPythonicTypesEnabled);
                        if (object.unversionedPackageDisabled != null)
                            message.unversionedPackageDisabled = Boolean(object.unversionedPackageDisabled);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExperimentalFeatures message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {google.api.PythonSettings.ExperimentalFeatures} message ExperimentalFeatures
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExperimentalFeatures.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.restAsyncIoEnabled = false;
                            object.protobufPythonicTypesEnabled = false;
                            object.unversionedPackageDisabled = false;
                        }
                        if (message.restAsyncIoEnabled != null && message.hasOwnProperty("restAsyncIoEnabled"))
                            object.restAsyncIoEnabled = message.restAsyncIoEnabled;
                        if (message.protobufPythonicTypesEnabled != null && message.hasOwnProperty("protobufPythonicTypesEnabled"))
                            object.protobufPythonicTypesEnabled = message.protobufPythonicTypesEnabled;
                        if (message.unversionedPackageDisabled != null && message.hasOwnProperty("unversionedPackageDisabled"))
                            object.unversionedPackageDisabled = message.unversionedPackageDisabled;
                        return object;
                    };
    
                    /**
                     * Converts this ExperimentalFeatures to JSON.
                     * @function toJSON
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExperimentalFeatures.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for ExperimentalFeatures
                     * @function getTypeUrl
                     * @memberof google.api.PythonSettings.ExperimentalFeatures
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    ExperimentalFeatures.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.api.PythonSettings.ExperimentalFeatures";
                    };
    
                    return ExperimentalFeatures;
                })();
    
                return PythonSettings;
            })();
    
            api.NodeSettings = (function() {
    
                /**
                 * Properties of a NodeSettings.
                 * @memberof google.api
                 * @interface INodeSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] NodeSettings common
                 */
    
                /**
                 * Constructs a new NodeSettings.
                 * @memberof google.api
                 * @classdesc Represents a NodeSettings.
                 * @implements INodeSettings
                 * @constructor
                 * @param {google.api.INodeSettings=} [properties] Properties to set
                 */
                function NodeSettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * NodeSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.NodeSettings
                 * @instance
                 */
                NodeSettings.prototype.common = null;
    
                /**
                 * Creates a new NodeSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {google.api.INodeSettings=} [properties] Properties to set
                 * @returns {google.api.NodeSettings} NodeSettings instance
                 */
                NodeSettings.create = function create(properties) {
                    return new NodeSettings(properties);
                };
    
                /**
                 * Encodes the specified NodeSettings message. Does not implicitly {@link google.api.NodeSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {google.api.INodeSettings} message NodeSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                NodeSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified NodeSettings message, length delimited. Does not implicitly {@link google.api.NodeSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {google.api.INodeSettings} message NodeSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                NodeSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a NodeSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.NodeSettings} NodeSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                NodeSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.NodeSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a NodeSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.NodeSettings} NodeSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                NodeSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a NodeSettings message.
                 * @function verify
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                NodeSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a NodeSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.NodeSettings} NodeSettings
                 */
                NodeSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.NodeSettings)
                        return object;
                    var message = new $root.google.api.NodeSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.NodeSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a NodeSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {google.api.NodeSettings} message NodeSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                NodeSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    return object;
                };
    
                /**
                 * Converts this NodeSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.NodeSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                NodeSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for NodeSettings
                 * @function getTypeUrl
                 * @memberof google.api.NodeSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                NodeSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.NodeSettings";
                };
    
                return NodeSettings;
            })();
    
            api.DotnetSettings = (function() {
    
                /**
                 * Properties of a DotnetSettings.
                 * @memberof google.api
                 * @interface IDotnetSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] DotnetSettings common
                 * @property {Object.<string,string>|null} [renamedServices] DotnetSettings renamedServices
                 * @property {Object.<string,string>|null} [renamedResources] DotnetSettings renamedResources
                 * @property {Array.<string>|null} [ignoredResources] DotnetSettings ignoredResources
                 * @property {Array.<string>|null} [forcedNamespaceAliases] DotnetSettings forcedNamespaceAliases
                 * @property {Array.<string>|null} [handwrittenSignatures] DotnetSettings handwrittenSignatures
                 */
    
                /**
                 * Constructs a new DotnetSettings.
                 * @memberof google.api
                 * @classdesc Represents a DotnetSettings.
                 * @implements IDotnetSettings
                 * @constructor
                 * @param {google.api.IDotnetSettings=} [properties] Properties to set
                 */
                function DotnetSettings(properties) {
                    this.renamedServices = {};
                    this.renamedResources = {};
                    this.ignoredResources = [];
                    this.forcedNamespaceAliases = [];
                    this.handwrittenSignatures = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DotnetSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.common = null;
    
                /**
                 * DotnetSettings renamedServices.
                 * @member {Object.<string,string>} renamedServices
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.renamedServices = $util.emptyObject;
    
                /**
                 * DotnetSettings renamedResources.
                 * @member {Object.<string,string>} renamedResources
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.renamedResources = $util.emptyObject;
    
                /**
                 * DotnetSettings ignoredResources.
                 * @member {Array.<string>} ignoredResources
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.ignoredResources = $util.emptyArray;
    
                /**
                 * DotnetSettings forcedNamespaceAliases.
                 * @member {Array.<string>} forcedNamespaceAliases
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.forcedNamespaceAliases = $util.emptyArray;
    
                /**
                 * DotnetSettings handwrittenSignatures.
                 * @member {Array.<string>} handwrittenSignatures
                 * @memberof google.api.DotnetSettings
                 * @instance
                 */
                DotnetSettings.prototype.handwrittenSignatures = $util.emptyArray;
    
                /**
                 * Creates a new DotnetSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {google.api.IDotnetSettings=} [properties] Properties to set
                 * @returns {google.api.DotnetSettings} DotnetSettings instance
                 */
                DotnetSettings.create = function create(properties) {
                    return new DotnetSettings(properties);
                };
    
                /**
                 * Encodes the specified DotnetSettings message. Does not implicitly {@link google.api.DotnetSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {google.api.IDotnetSettings} message DotnetSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DotnetSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.renamedServices != null && Object.hasOwnProperty.call(message, "renamedServices"))
                        for (var keys = Object.keys(message.renamedServices), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.renamedServices[keys[i]]).ldelim();
                    if (message.renamedResources != null && Object.hasOwnProperty.call(message, "renamedResources"))
                        for (var keys = Object.keys(message.renamedResources), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.renamedResources[keys[i]]).ldelim();
                    if (message.ignoredResources != null && message.ignoredResources.length)
                        for (var i = 0; i < message.ignoredResources.length; ++i)
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.ignoredResources[i]);
                    if (message.forcedNamespaceAliases != null && message.forcedNamespaceAliases.length)
                        for (var i = 0; i < message.forcedNamespaceAliases.length; ++i)
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.forcedNamespaceAliases[i]);
                    if (message.handwrittenSignatures != null && message.handwrittenSignatures.length)
                        for (var i = 0; i < message.handwrittenSignatures.length; ++i)
                            writer.uint32(/* id 6, wireType 2 =*/50).string(message.handwrittenSignatures[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified DotnetSettings message, length delimited. Does not implicitly {@link google.api.DotnetSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {google.api.IDotnetSettings} message DotnetSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DotnetSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DotnetSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.DotnetSettings} DotnetSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DotnetSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.DotnetSettings(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 2: {
                                if (message.renamedServices === $util.emptyObject)
                                    message.renamedServices = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.renamedServices[key] = value;
                                break;
                            }
                        case 3: {
                                if (message.renamedResources === $util.emptyObject)
                                    message.renamedResources = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.renamedResources[key] = value;
                                break;
                            }
                        case 4: {
                                if (!(message.ignoredResources && message.ignoredResources.length))
                                    message.ignoredResources = [];
                                message.ignoredResources.push(reader.string());
                                break;
                            }
                        case 5: {
                                if (!(message.forcedNamespaceAliases && message.forcedNamespaceAliases.length))
                                    message.forcedNamespaceAliases = [];
                                message.forcedNamespaceAliases.push(reader.string());
                                break;
                            }
                        case 6: {
                                if (!(message.handwrittenSignatures && message.handwrittenSignatures.length))
                                    message.handwrittenSignatures = [];
                                message.handwrittenSignatures.push(reader.string());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DotnetSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.DotnetSettings} DotnetSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DotnetSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DotnetSettings message.
                 * @function verify
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DotnetSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    if (message.renamedServices != null && message.hasOwnProperty("renamedServices")) {
                        if (!$util.isObject(message.renamedServices))
                            return "renamedServices: object expected";
                        var key = Object.keys(message.renamedServices);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.renamedServices[key[i]]))
                                return "renamedServices: string{k:string} expected";
                    }
                    if (message.renamedResources != null && message.hasOwnProperty("renamedResources")) {
                        if (!$util.isObject(message.renamedResources))
                            return "renamedResources: object expected";
                        var key = Object.keys(message.renamedResources);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.renamedResources[key[i]]))
                                return "renamedResources: string{k:string} expected";
                    }
                    if (message.ignoredResources != null && message.hasOwnProperty("ignoredResources")) {
                        if (!Array.isArray(message.ignoredResources))
                            return "ignoredResources: array expected";
                        for (var i = 0; i < message.ignoredResources.length; ++i)
                            if (!$util.isString(message.ignoredResources[i]))
                                return "ignoredResources: string[] expected";
                    }
                    if (message.forcedNamespaceAliases != null && message.hasOwnProperty("forcedNamespaceAliases")) {
                        if (!Array.isArray(message.forcedNamespaceAliases))
                            return "forcedNamespaceAliases: array expected";
                        for (var i = 0; i < message.forcedNamespaceAliases.length; ++i)
                            if (!$util.isString(message.forcedNamespaceAliases[i]))
                                return "forcedNamespaceAliases: string[] expected";
                    }
                    if (message.handwrittenSignatures != null && message.hasOwnProperty("handwrittenSignatures")) {
                        if (!Array.isArray(message.handwrittenSignatures))
                            return "handwrittenSignatures: array expected";
                        for (var i = 0; i < message.handwrittenSignatures.length; ++i)
                            if (!$util.isString(message.handwrittenSignatures[i]))
                                return "handwrittenSignatures: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a DotnetSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.DotnetSettings} DotnetSettings
                 */
                DotnetSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.DotnetSettings)
                        return object;
                    var message = new $root.google.api.DotnetSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.DotnetSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    if (object.renamedServices) {
                        if (typeof object.renamedServices !== "object")
                            throw TypeError(".google.api.DotnetSettings.renamedServices: object expected");
                        message.renamedServices = {};
                        for (var keys = Object.keys(object.renamedServices), i = 0; i < keys.length; ++i)
                            message.renamedServices[keys[i]] = String(object.renamedServices[keys[i]]);
                    }
                    if (object.renamedResources) {
                        if (typeof object.renamedResources !== "object")
                            throw TypeError(".google.api.DotnetSettings.renamedResources: object expected");
                        message.renamedResources = {};
                        for (var keys = Object.keys(object.renamedResources), i = 0; i < keys.length; ++i)
                            message.renamedResources[keys[i]] = String(object.renamedResources[keys[i]]);
                    }
                    if (object.ignoredResources) {
                        if (!Array.isArray(object.ignoredResources))
                            throw TypeError(".google.api.DotnetSettings.ignoredResources: array expected");
                        message.ignoredResources = [];
                        for (var i = 0; i < object.ignoredResources.length; ++i)
                            message.ignoredResources[i] = String(object.ignoredResources[i]);
                    }
                    if (object.forcedNamespaceAliases) {
                        if (!Array.isArray(object.forcedNamespaceAliases))
                            throw TypeError(".google.api.DotnetSettings.forcedNamespaceAliases: array expected");
                        message.forcedNamespaceAliases = [];
                        for (var i = 0; i < object.forcedNamespaceAliases.length; ++i)
                            message.forcedNamespaceAliases[i] = String(object.forcedNamespaceAliases[i]);
                    }
                    if (object.handwrittenSignatures) {
                        if (!Array.isArray(object.handwrittenSignatures))
                            throw TypeError(".google.api.DotnetSettings.handwrittenSignatures: array expected");
                        message.handwrittenSignatures = [];
                        for (var i = 0; i < object.handwrittenSignatures.length; ++i)
                            message.handwrittenSignatures[i] = String(object.handwrittenSignatures[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a DotnetSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {google.api.DotnetSettings} message DotnetSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DotnetSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.ignoredResources = [];
                        object.forcedNamespaceAliases = [];
                        object.handwrittenSignatures = [];
                    }
                    if (options.objects || options.defaults) {
                        object.renamedServices = {};
                        object.renamedResources = {};
                    }
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    var keys2;
                    if (message.renamedServices && (keys2 = Object.keys(message.renamedServices)).length) {
                        object.renamedServices = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.renamedServices[keys2[j]] = message.renamedServices[keys2[j]];
                    }
                    if (message.renamedResources && (keys2 = Object.keys(message.renamedResources)).length) {
                        object.renamedResources = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.renamedResources[keys2[j]] = message.renamedResources[keys2[j]];
                    }
                    if (message.ignoredResources && message.ignoredResources.length) {
                        object.ignoredResources = [];
                        for (var j = 0; j < message.ignoredResources.length; ++j)
                            object.ignoredResources[j] = message.ignoredResources[j];
                    }
                    if (message.forcedNamespaceAliases && message.forcedNamespaceAliases.length) {
                        object.forcedNamespaceAliases = [];
                        for (var j = 0; j < message.forcedNamespaceAliases.length; ++j)
                            object.forcedNamespaceAliases[j] = message.forcedNamespaceAliases[j];
                    }
                    if (message.handwrittenSignatures && message.handwrittenSignatures.length) {
                        object.handwrittenSignatures = [];
                        for (var j = 0; j < message.handwrittenSignatures.length; ++j)
                            object.handwrittenSignatures[j] = message.handwrittenSignatures[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this DotnetSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.DotnetSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DotnetSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for DotnetSettings
                 * @function getTypeUrl
                 * @memberof google.api.DotnetSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                DotnetSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.DotnetSettings";
                };
    
                return DotnetSettings;
            })();
    
            api.RubySettings = (function() {
    
                /**
                 * Properties of a RubySettings.
                 * @memberof google.api
                 * @interface IRubySettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] RubySettings common
                 */
    
                /**
                 * Constructs a new RubySettings.
                 * @memberof google.api
                 * @classdesc Represents a RubySettings.
                 * @implements IRubySettings
                 * @constructor
                 * @param {google.api.IRubySettings=} [properties] Properties to set
                 */
                function RubySettings(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * RubySettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.RubySettings
                 * @instance
                 */
                RubySettings.prototype.common = null;
    
                /**
                 * Creates a new RubySettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {google.api.IRubySettings=} [properties] Properties to set
                 * @returns {google.api.RubySettings} RubySettings instance
                 */
                RubySettings.create = function create(properties) {
                    return new RubySettings(properties);
                };
    
                /**
                 * Encodes the specified RubySettings message. Does not implicitly {@link google.api.RubySettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {google.api.IRubySettings} message RubySettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RubySettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified RubySettings message, length delimited. Does not implicitly {@link google.api.RubySettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {google.api.IRubySettings} message RubySettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                RubySettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a RubySettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.RubySettings} RubySettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RubySettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.RubySettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a RubySettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.RubySettings} RubySettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                RubySettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a RubySettings message.
                 * @function verify
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                RubySettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a RubySettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.RubySettings} RubySettings
                 */
                RubySettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.RubySettings)
                        return object;
                    var message = new $root.google.api.RubySettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.RubySettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a RubySettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {google.api.RubySettings} message RubySettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                RubySettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    return object;
                };
    
                /**
                 * Converts this RubySettings to JSON.
                 * @function toJSON
                 * @memberof google.api.RubySettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                RubySettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for RubySettings
                 * @function getTypeUrl
                 * @memberof google.api.RubySettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                RubySettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.RubySettings";
                };
    
                return RubySettings;
            })();
    
            api.GoSettings = (function() {
    
                /**
                 * Properties of a GoSettings.
                 * @memberof google.api
                 * @interface IGoSettings
                 * @property {google.api.ICommonLanguageSettings|null} [common] GoSettings common
                 * @property {Object.<string,string>|null} [renamedServices] GoSettings renamedServices
                 */
    
                /**
                 * Constructs a new GoSettings.
                 * @memberof google.api
                 * @classdesc Represents a GoSettings.
                 * @implements IGoSettings
                 * @constructor
                 * @param {google.api.IGoSettings=} [properties] Properties to set
                 */
                function GoSettings(properties) {
                    this.renamedServices = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * GoSettings common.
                 * @member {google.api.ICommonLanguageSettings|null|undefined} common
                 * @memberof google.api.GoSettings
                 * @instance
                 */
                GoSettings.prototype.common = null;
    
                /**
                 * GoSettings renamedServices.
                 * @member {Object.<string,string>} renamedServices
                 * @memberof google.api.GoSettings
                 * @instance
                 */
                GoSettings.prototype.renamedServices = $util.emptyObject;
    
                /**
                 * Creates a new GoSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {google.api.IGoSettings=} [properties] Properties to set
                 * @returns {google.api.GoSettings} GoSettings instance
                 */
                GoSettings.create = function create(properties) {
                    return new GoSettings(properties);
                };
    
                /**
                 * Encodes the specified GoSettings message. Does not implicitly {@link google.api.GoSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {google.api.IGoSettings} message GoSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GoSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.common != null && Object.hasOwnProperty.call(message, "common"))
                        $root.google.api.CommonLanguageSettings.encode(message.common, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.renamedServices != null && Object.hasOwnProperty.call(message, "renamedServices"))
                        for (var keys = Object.keys(message.renamedServices), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.renamedServices[keys[i]]).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified GoSettings message, length delimited. Does not implicitly {@link google.api.GoSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {google.api.IGoSettings} message GoSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GoSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a GoSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.GoSettings} GoSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GoSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.GoSettings(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.common = $root.google.api.CommonLanguageSettings.decode(reader, reader.uint32());
                                break;
                            }
                        case 2: {
                                if (message.renamedServices === $util.emptyObject)
                                    message.renamedServices = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.renamedServices[key] = value;
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a GoSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.GoSettings} GoSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GoSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a GoSettings message.
                 * @function verify
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                GoSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.common != null && message.hasOwnProperty("common")) {
                        var error = $root.google.api.CommonLanguageSettings.verify(message.common);
                        if (error)
                            return "common." + error;
                    }
                    if (message.renamedServices != null && message.hasOwnProperty("renamedServices")) {
                        if (!$util.isObject(message.renamedServices))
                            return "renamedServices: object expected";
                        var key = Object.keys(message.renamedServices);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.renamedServices[key[i]]))
                                return "renamedServices: string{k:string} expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a GoSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.GoSettings} GoSettings
                 */
                GoSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.GoSettings)
                        return object;
                    var message = new $root.google.api.GoSettings();
                    if (object.common != null) {
                        if (typeof object.common !== "object")
                            throw TypeError(".google.api.GoSettings.common: object expected");
                        message.common = $root.google.api.CommonLanguageSettings.fromObject(object.common);
                    }
                    if (object.renamedServices) {
                        if (typeof object.renamedServices !== "object")
                            throw TypeError(".google.api.GoSettings.renamedServices: object expected");
                        message.renamedServices = {};
                        for (var keys = Object.keys(object.renamedServices), i = 0; i < keys.length; ++i)
                            message.renamedServices[keys[i]] = String(object.renamedServices[keys[i]]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a GoSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {google.api.GoSettings} message GoSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                GoSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.renamedServices = {};
                    if (options.defaults)
                        object.common = null;
                    if (message.common != null && message.hasOwnProperty("common"))
                        object.common = $root.google.api.CommonLanguageSettings.toObject(message.common, options);
                    var keys2;
                    if (message.renamedServices && (keys2 = Object.keys(message.renamedServices)).length) {
                        object.renamedServices = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.renamedServices[keys2[j]] = message.renamedServices[keys2[j]];
                    }
                    return object;
                };
    
                /**
                 * Converts this GoSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.GoSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                GoSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for GoSettings
                 * @function getTypeUrl
                 * @memberof google.api.GoSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                GoSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.GoSettings";
                };
    
                return GoSettings;
            })();
    
            api.MethodSettings = (function() {
    
                /**
                 * Properties of a MethodSettings.
                 * @memberof google.api
                 * @interface IMethodSettings
                 * @property {string|null} [selector] MethodSettings selector
                 * @property {google.api.MethodSettings.ILongRunning|null} [longRunning] MethodSettings longRunning
                 * @property {Array.<string>|null} [autoPopulatedFields] MethodSettings autoPopulatedFields
                 */
    
                /**
                 * Constructs a new MethodSettings.
                 * @memberof google.api
                 * @classdesc Represents a MethodSettings.
                 * @implements IMethodSettings
                 * @constructor
                 * @param {google.api.IMethodSettings=} [properties] Properties to set
                 */
                function MethodSettings(properties) {
                    this.autoPopulatedFields = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MethodSettings selector.
                 * @member {string} selector
                 * @memberof google.api.MethodSettings
                 * @instance
                 */
                MethodSettings.prototype.selector = "";
    
                /**
                 * MethodSettings longRunning.
                 * @member {google.api.MethodSettings.ILongRunning|null|undefined} longRunning
                 * @memberof google.api.MethodSettings
                 * @instance
                 */
                MethodSettings.prototype.longRunning = null;
    
                /**
                 * MethodSettings autoPopulatedFields.
                 * @member {Array.<string>} autoPopulatedFields
                 * @memberof google.api.MethodSettings
                 * @instance
                 */
                MethodSettings.prototype.autoPopulatedFields = $util.emptyArray;
    
                /**
                 * Creates a new MethodSettings instance using the specified properties.
                 * @function create
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {google.api.IMethodSettings=} [properties] Properties to set
                 * @returns {google.api.MethodSettings} MethodSettings instance
                 */
                MethodSettings.create = function create(properties) {
                    return new MethodSettings(properties);
                };
    
                /**
                 * Encodes the specified MethodSettings message. Does not implicitly {@link google.api.MethodSettings.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {google.api.IMethodSettings} message MethodSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodSettings.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.selector != null && Object.hasOwnProperty.call(message, "selector"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.selector);
                    if (message.longRunning != null && Object.hasOwnProperty.call(message, "longRunning"))
                        $root.google.api.MethodSettings.LongRunning.encode(message.longRunning, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.autoPopulatedFields != null && message.autoPopulatedFields.length)
                        for (var i = 0; i < message.autoPopulatedFields.length; ++i)
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.autoPopulatedFields[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified MethodSettings message, length delimited. Does not implicitly {@link google.api.MethodSettings.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {google.api.IMethodSettings} message MethodSettings message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodSettings.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MethodSettings message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.MethodSettings} MethodSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodSettings.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MethodSettings();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.selector = reader.string();
                                break;
                            }
                        case 2: {
                                message.longRunning = $root.google.api.MethodSettings.LongRunning.decode(reader, reader.uint32());
                                break;
                            }
                        case 3: {
                                if (!(message.autoPopulatedFields && message.autoPopulatedFields.length))
                                    message.autoPopulatedFields = [];
                                message.autoPopulatedFields.push(reader.string());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MethodSettings message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.MethodSettings} MethodSettings
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodSettings.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MethodSettings message.
                 * @function verify
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MethodSettings.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        if (!$util.isString(message.selector))
                            return "selector: string expected";
                    if (message.longRunning != null && message.hasOwnProperty("longRunning")) {
                        var error = $root.google.api.MethodSettings.LongRunning.verify(message.longRunning);
                        if (error)
                            return "longRunning." + error;
                    }
                    if (message.autoPopulatedFields != null && message.hasOwnProperty("autoPopulatedFields")) {
                        if (!Array.isArray(message.autoPopulatedFields))
                            return "autoPopulatedFields: array expected";
                        for (var i = 0; i < message.autoPopulatedFields.length; ++i)
                            if (!$util.isString(message.autoPopulatedFields[i]))
                                return "autoPopulatedFields: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a MethodSettings message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.MethodSettings} MethodSettings
                 */
                MethodSettings.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.MethodSettings)
                        return object;
                    var message = new $root.google.api.MethodSettings();
                    if (object.selector != null)
                        message.selector = String(object.selector);
                    if (object.longRunning != null) {
                        if (typeof object.longRunning !== "object")
                            throw TypeError(".google.api.MethodSettings.longRunning: object expected");
                        message.longRunning = $root.google.api.MethodSettings.LongRunning.fromObject(object.longRunning);
                    }
                    if (object.autoPopulatedFields) {
                        if (!Array.isArray(object.autoPopulatedFields))
                            throw TypeError(".google.api.MethodSettings.autoPopulatedFields: array expected");
                        message.autoPopulatedFields = [];
                        for (var i = 0; i < object.autoPopulatedFields.length; ++i)
                            message.autoPopulatedFields[i] = String(object.autoPopulatedFields[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MethodSettings message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {google.api.MethodSettings} message MethodSettings
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MethodSettings.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.autoPopulatedFields = [];
                    if (options.defaults) {
                        object.selector = "";
                        object.longRunning = null;
                    }
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        object.selector = message.selector;
                    if (message.longRunning != null && message.hasOwnProperty("longRunning"))
                        object.longRunning = $root.google.api.MethodSettings.LongRunning.toObject(message.longRunning, options);
                    if (message.autoPopulatedFields && message.autoPopulatedFields.length) {
                        object.autoPopulatedFields = [];
                        for (var j = 0; j < message.autoPopulatedFields.length; ++j)
                            object.autoPopulatedFields[j] = message.autoPopulatedFields[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this MethodSettings to JSON.
                 * @function toJSON
                 * @memberof google.api.MethodSettings
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MethodSettings.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for MethodSettings
                 * @function getTypeUrl
                 * @memberof google.api.MethodSettings
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                MethodSettings.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.MethodSettings";
                };
    
                MethodSettings.LongRunning = (function() {
    
                    /**
                     * Properties of a LongRunning.
                     * @memberof google.api.MethodSettings
                     * @interface ILongRunning
                     * @property {google.protobuf.IDuration|null} [initialPollDelay] LongRunning initialPollDelay
                     * @property {number|null} [pollDelayMultiplier] LongRunning pollDelayMultiplier
                     * @property {google.protobuf.IDuration|null} [maxPollDelay] LongRunning maxPollDelay
                     * @property {google.protobuf.IDuration|null} [totalPollTimeout] LongRunning totalPollTimeout
                     */
    
                    /**
                     * Constructs a new LongRunning.
                     * @memberof google.api.MethodSettings
                     * @classdesc Represents a LongRunning.
                     * @implements ILongRunning
                     * @constructor
                     * @param {google.api.MethodSettings.ILongRunning=} [properties] Properties to set
                     */
                    function LongRunning(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LongRunning initialPollDelay.
                     * @member {google.protobuf.IDuration|null|undefined} initialPollDelay
                     * @memberof google.api.MethodSettings.LongRunning
                     * @instance
                     */
                    LongRunning.prototype.initialPollDelay = null;
    
                    /**
                     * LongRunning pollDelayMultiplier.
                     * @member {number} pollDelayMultiplier
                     * @memberof google.api.MethodSettings.LongRunning
                     * @instance
                     */
                    LongRunning.prototype.pollDelayMultiplier = 0;
    
                    /**
                     * LongRunning maxPollDelay.
                     * @member {google.protobuf.IDuration|null|undefined} maxPollDelay
                     * @memberof google.api.MethodSettings.LongRunning
                     * @instance
                     */
                    LongRunning.prototype.maxPollDelay = null;
    
                    /**
                     * LongRunning totalPollTimeout.
                     * @member {google.protobuf.IDuration|null|undefined} totalPollTimeout
                     * @memberof google.api.MethodSettings.LongRunning
                     * @instance
                     */
                    LongRunning.prototype.totalPollTimeout = null;
    
                    /**
                     * Creates a new LongRunning instance using the specified properties.
                     * @function create
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {google.api.MethodSettings.ILongRunning=} [properties] Properties to set
                     * @returns {google.api.MethodSettings.LongRunning} LongRunning instance
                     */
                    LongRunning.create = function create(properties) {
                        return new LongRunning(properties);
                    };
    
                    /**
                     * Encodes the specified LongRunning message. Does not implicitly {@link google.api.MethodSettings.LongRunning.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {google.api.MethodSettings.ILongRunning} message LongRunning message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LongRunning.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.initialPollDelay != null && Object.hasOwnProperty.call(message, "initialPollDelay"))
                            $root.google.protobuf.Duration.encode(message.initialPollDelay, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.pollDelayMultiplier != null && Object.hasOwnProperty.call(message, "pollDelayMultiplier"))
                            writer.uint32(/* id 2, wireType 5 =*/21).float(message.pollDelayMultiplier);
                        if (message.maxPollDelay != null && Object.hasOwnProperty.call(message, "maxPollDelay"))
                            $root.google.protobuf.Duration.encode(message.maxPollDelay, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        if (message.totalPollTimeout != null && Object.hasOwnProperty.call(message, "totalPollTimeout"))
                            $root.google.protobuf.Duration.encode(message.totalPollTimeout, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LongRunning message, length delimited. Does not implicitly {@link google.api.MethodSettings.LongRunning.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {google.api.MethodSettings.ILongRunning} message LongRunning message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LongRunning.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LongRunning message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.MethodSettings.LongRunning} LongRunning
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LongRunning.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MethodSettings.LongRunning();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.initialPollDelay = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                    break;
                                }
                            case 2: {
                                    message.pollDelayMultiplier = reader.float();
                                    break;
                                }
                            case 3: {
                                    message.maxPollDelay = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                    break;
                                }
                            case 4: {
                                    message.totalPollTimeout = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LongRunning message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.MethodSettings.LongRunning} LongRunning
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LongRunning.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LongRunning message.
                     * @function verify
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LongRunning.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.initialPollDelay != null && message.hasOwnProperty("initialPollDelay")) {
                            var error = $root.google.protobuf.Duration.verify(message.initialPollDelay);
                            if (error)
                                return "initialPollDelay." + error;
                        }
                        if (message.pollDelayMultiplier != null && message.hasOwnProperty("pollDelayMultiplier"))
                            if (typeof message.pollDelayMultiplier !== "number")
                                return "pollDelayMultiplier: number expected";
                        if (message.maxPollDelay != null && message.hasOwnProperty("maxPollDelay")) {
                            var error = $root.google.protobuf.Duration.verify(message.maxPollDelay);
                            if (error)
                                return "maxPollDelay." + error;
                        }
                        if (message.totalPollTimeout != null && message.hasOwnProperty("totalPollTimeout")) {
                            var error = $root.google.protobuf.Duration.verify(message.totalPollTimeout);
                            if (error)
                                return "totalPollTimeout." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a LongRunning message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.MethodSettings.LongRunning} LongRunning
                     */
                    LongRunning.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.MethodSettings.LongRunning)
                            return object;
                        var message = new $root.google.api.MethodSettings.LongRunning();
                        if (object.initialPollDelay != null) {
                            if (typeof object.initialPollDelay !== "object")
                                throw TypeError(".google.api.MethodSettings.LongRunning.initialPollDelay: object expected");
                            message.initialPollDelay = $root.google.protobuf.Duration.fromObject(object.initialPollDelay);
                        }
                        if (object.pollDelayMultiplier != null)
                            message.pollDelayMultiplier = Number(object.pollDelayMultiplier);
                        if (object.maxPollDelay != null) {
                            if (typeof object.maxPollDelay !== "object")
                                throw TypeError(".google.api.MethodSettings.LongRunning.maxPollDelay: object expected");
                            message.maxPollDelay = $root.google.protobuf.Duration.fromObject(object.maxPollDelay);
                        }
                        if (object.totalPollTimeout != null) {
                            if (typeof object.totalPollTimeout !== "object")
                                throw TypeError(".google.api.MethodSettings.LongRunning.totalPollTimeout: object expected");
                            message.totalPollTimeout = $root.google.protobuf.Duration.fromObject(object.totalPollTimeout);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LongRunning message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {google.api.MethodSettings.LongRunning} message LongRunning
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LongRunning.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.initialPollDelay = null;
                            object.pollDelayMultiplier = 0;
                            object.maxPollDelay = null;
                            object.totalPollTimeout = null;
                        }
                        if (message.initialPollDelay != null && message.hasOwnProperty("initialPollDelay"))
                            object.initialPollDelay = $root.google.protobuf.Duration.toObject(message.initialPollDelay, options);
                        if (message.pollDelayMultiplier != null && message.hasOwnProperty("pollDelayMultiplier"))
                            object.pollDelayMultiplier = options.json && !isFinite(message.pollDelayMultiplier) ? String(message.pollDelayMultiplier) : message.pollDelayMultiplier;
                        if (message.maxPollDelay != null && message.hasOwnProperty("maxPollDelay"))
                            object.maxPollDelay = $root.google.protobuf.Duration.toObject(message.maxPollDelay, options);
                        if (message.totalPollTimeout != null && message.hasOwnProperty("totalPollTimeout"))
                            object.totalPollTimeout = $root.google.protobuf.Duration.toObject(message.totalPollTimeout, options);
                        return object;
                    };
    
                    /**
                     * Converts this LongRunning to JSON.
                     * @function toJSON
                     * @memberof google.api.MethodSettings.LongRunning
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LongRunning.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for LongRunning
                     * @function getTypeUrl
                     * @memberof google.api.MethodSettings.LongRunning
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    LongRunning.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.api.MethodSettings.LongRunning";
                    };
    
                    return LongRunning;
                })();
    
                return MethodSettings;
            })();
    
            /**
             * ClientLibraryOrganization enum.
             * @name google.api.ClientLibraryOrganization
             * @enum {number}
             * @property {number} CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED=0 CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED value
             * @property {number} CLOUD=1 CLOUD value
             * @property {number} ADS=2 ADS value
             * @property {number} PHOTOS=3 PHOTOS value
             * @property {number} STREET_VIEW=4 STREET_VIEW value
             * @property {number} SHOPPING=5 SHOPPING value
             * @property {number} GEO=6 GEO value
             * @property {number} GENERATIVE_AI=7 GENERATIVE_AI value
             */
            api.ClientLibraryOrganization = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED"] = 0;
                values[valuesById[1] = "CLOUD"] = 1;
                values[valuesById[2] = "ADS"] = 2;
                values[valuesById[3] = "PHOTOS"] = 3;
                values[valuesById[4] = "STREET_VIEW"] = 4;
                values[valuesById[5] = "SHOPPING"] = 5;
                values[valuesById[6] = "GEO"] = 6;
                values[valuesById[7] = "GENERATIVE_AI"] = 7;
                return values;
            })();
    
            /**
             * ClientLibraryDestination enum.
             * @name google.api.ClientLibraryDestination
             * @enum {number}
             * @property {number} CLIENT_LIBRARY_DESTINATION_UNSPECIFIED=0 CLIENT_LIBRARY_DESTINATION_UNSPECIFIED value
             * @property {number} GITHUB=10 GITHUB value
             * @property {number} PACKAGE_MANAGER=20 PACKAGE_MANAGER value
             */
            api.ClientLibraryDestination = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED"] = 0;
                values[valuesById[10] = "GITHUB"] = 10;
                values[valuesById[20] = "PACKAGE_MANAGER"] = 20;
                return values;
            })();
    
            api.SelectiveGapicGeneration = (function() {
    
                /**
                 * Properties of a SelectiveGapicGeneration.
                 * @memberof google.api
                 * @interface ISelectiveGapicGeneration
                 * @property {Array.<string>|null} [methods] SelectiveGapicGeneration methods
                 * @property {boolean|null} [generateOmittedAsInternal] SelectiveGapicGeneration generateOmittedAsInternal
                 */
    
                /**
                 * Constructs a new SelectiveGapicGeneration.
                 * @memberof google.api
                 * @classdesc Represents a SelectiveGapicGeneration.
                 * @implements ISelectiveGapicGeneration
                 * @constructor
                 * @param {google.api.ISelectiveGapicGeneration=} [properties] Properties to set
                 */
                function SelectiveGapicGeneration(properties) {
                    this.methods = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * SelectiveGapicGeneration methods.
                 * @member {Array.<string>} methods
                 * @memberof google.api.SelectiveGapicGeneration
                 * @instance
                 */
                SelectiveGapicGeneration.prototype.methods = $util.emptyArray;
    
                /**
                 * SelectiveGapicGeneration generateOmittedAsInternal.
                 * @member {boolean} generateOmittedAsInternal
                 * @memberof google.api.SelectiveGapicGeneration
                 * @instance
                 */
                SelectiveGapicGeneration.prototype.generateOmittedAsInternal = false;
    
                /**
                 * Creates a new SelectiveGapicGeneration instance using the specified properties.
                 * @function create
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {google.api.ISelectiveGapicGeneration=} [properties] Properties to set
                 * @returns {google.api.SelectiveGapicGeneration} SelectiveGapicGeneration instance
                 */
                SelectiveGapicGeneration.create = function create(properties) {
                    return new SelectiveGapicGeneration(properties);
                };
    
                /**
                 * Encodes the specified SelectiveGapicGeneration message. Does not implicitly {@link google.api.SelectiveGapicGeneration.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {google.api.ISelectiveGapicGeneration} message SelectiveGapicGeneration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SelectiveGapicGeneration.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.methods != null && message.methods.length)
                        for (var i = 0; i < message.methods.length; ++i)
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.methods[i]);
                    if (message.generateOmittedAsInternal != null && Object.hasOwnProperty.call(message, "generateOmittedAsInternal"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.generateOmittedAsInternal);
                    return writer;
                };
    
                /**
                 * Encodes the specified SelectiveGapicGeneration message, length delimited. Does not implicitly {@link google.api.SelectiveGapicGeneration.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {google.api.ISelectiveGapicGeneration} message SelectiveGapicGeneration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SelectiveGapicGeneration.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a SelectiveGapicGeneration message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.SelectiveGapicGeneration} SelectiveGapicGeneration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SelectiveGapicGeneration.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.SelectiveGapicGeneration();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.methods && message.methods.length))
                                    message.methods = [];
                                message.methods.push(reader.string());
                                break;
                            }
                        case 2: {
                                message.generateOmittedAsInternal = reader.bool();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a SelectiveGapicGeneration message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.SelectiveGapicGeneration} SelectiveGapicGeneration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SelectiveGapicGeneration.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a SelectiveGapicGeneration message.
                 * @function verify
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                SelectiveGapicGeneration.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.methods != null && message.hasOwnProperty("methods")) {
                        if (!Array.isArray(message.methods))
                            return "methods: array expected";
                        for (var i = 0; i < message.methods.length; ++i)
                            if (!$util.isString(message.methods[i]))
                                return "methods: string[] expected";
                    }
                    if (message.generateOmittedAsInternal != null && message.hasOwnProperty("generateOmittedAsInternal"))
                        if (typeof message.generateOmittedAsInternal !== "boolean")
                            return "generateOmittedAsInternal: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a SelectiveGapicGeneration message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.SelectiveGapicGeneration} SelectiveGapicGeneration
                 */
                SelectiveGapicGeneration.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.SelectiveGapicGeneration)
                        return object;
                    var message = new $root.google.api.SelectiveGapicGeneration();
                    if (object.methods) {
                        if (!Array.isArray(object.methods))
                            throw TypeError(".google.api.SelectiveGapicGeneration.methods: array expected");
                        message.methods = [];
                        for (var i = 0; i < object.methods.length; ++i)
                            message.methods[i] = String(object.methods[i]);
                    }
                    if (object.generateOmittedAsInternal != null)
                        message.generateOmittedAsInternal = Boolean(object.generateOmittedAsInternal);
                    return message;
                };
    
                /**
                 * Creates a plain object from a SelectiveGapicGeneration message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {google.api.SelectiveGapicGeneration} message SelectiveGapicGeneration
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                SelectiveGapicGeneration.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.methods = [];
                    if (options.defaults)
                        object.generateOmittedAsInternal = false;
                    if (message.methods && message.methods.length) {
                        object.methods = [];
                        for (var j = 0; j < message.methods.length; ++j)
                            object.methods[j] = message.methods[j];
                    }
                    if (message.generateOmittedAsInternal != null && message.hasOwnProperty("generateOmittedAsInternal"))
                        object.generateOmittedAsInternal = message.generateOmittedAsInternal;
                    return object;
                };
    
                /**
                 * Converts this SelectiveGapicGeneration to JSON.
                 * @function toJSON
                 * @memberof google.api.SelectiveGapicGeneration
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                SelectiveGapicGeneration.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for SelectiveGapicGeneration
                 * @function getTypeUrl
                 * @memberof google.api.SelectiveGapicGeneration
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                SelectiveGapicGeneration.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.api.SelectiveGapicGeneration";
                };
    
                return SelectiveGapicGeneration;
            })();
    
            /**
             * LaunchStage enum.
             * @name google.api.LaunchStage
             * @enum {number}
             * @property {number} LAUNCH_STAGE_UNSPECIFIED=0 LAUNCH_STAGE_UNSPECIFIED value
             * @property {number} UNIMPLEMENTED=6 UNIMPLEMENTED value
             * @property {number} PRELAUNCH=7 PRELAUNCH value
             * @property {number} EARLY_ACCESS=1 EARLY_ACCESS value
             * @property {number} ALPHA=2 ALPHA value
             * @property {number} BETA=3 BETA value
             * @property {number} GA=4 GA value
             * @property {number} DEPRECATED=5 DEPRECATED value
             */
            api.LaunchStage = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "LAUNCH_STAGE_UNSPECIFIED"] = 0;
                values[valuesById[6] = "UNIMPLEMENTED"] = 6;
                values[valuesById[7] = "PRELAUNCH"] = 7;
                values[valuesById[1] = "EARLY_ACCESS"] = 1;
                values[valuesById[2] = "ALPHA"] = 2;
                values[valuesById[3] = "BETA"] = 3;
                values[valuesById[4] = "GA"] = 4;
                values[valuesById[5] = "DEPRECATED"] = 5;
                return values;
            })();
    
            return api;
        })();
    
        google.longrunning = (function() {
    
            /**
             * Namespace longrunning.
             * @memberof google
             * @namespace
             */
            var longrunning = {};
    
            longrunning.Operations = (function() {
    
                /**
                 * Constructs a new Operations service.
                 * @memberof google.longrunning
                 * @classdesc Represents an Operations
                 * @extends $protobuf.rpc.Service
                 * @constructor
                 * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                 * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                 * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                 */
                function Operations(rpcImpl, requestDelimited, responseDelimited) {
                    $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                }
    
                (Operations.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = Operations;
    
                /**
                 * Creates new Operations service using the specified rpc implementation.
                 * @function create
                 * @memberof google.longrunning.Operations
                 * @static
                 * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                 * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                 * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                 * @returns {Operations} RPC service. Useful where requests and/or responses are streamed.
                 */
                Operations.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                    return new this(rpcImpl, requestDelimited, responseDelimited);
                };
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|listOperations}.
                 * @memberof google.longrunning.Operations
                 * @typedef ListOperationsCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.ListOperationsResponse} [response] ListOperationsResponse
                 */
    
                /**
                 * Calls ListOperations.
                 * @function listOperations
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IListOperationsRequest} request ListOperationsRequest message or plain object
                 * @param {google.longrunning.Operations.ListOperationsCallback} callback Node-style callback called with the error, if any, and ListOperationsResponse
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.listOperations = function listOperations(request, callback) {
                    return this.rpcCall(listOperations, $root.google.longrunning.ListOperationsRequest, $root.google.longrunning.ListOperationsResponse, request, callback);
                }, "name", { value: "ListOperations" });
    
                /**
                 * Calls ListOperations.
                 * @function listOperations
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IListOperationsRequest} request ListOperationsRequest message or plain object
                 * @returns {Promise<google.longrunning.ListOperationsResponse>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|getOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef GetOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.Operation} [response] Operation
                 */
    
                /**
                 * Calls GetOperation.
                 * @function getOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IGetOperationRequest} request GetOperationRequest message or plain object
                 * @param {google.longrunning.Operations.GetOperationCallback} callback Node-style callback called with the error, if any, and Operation
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.getOperation = function getOperation(request, callback) {
                    return this.rpcCall(getOperation, $root.google.longrunning.GetOperationRequest, $root.google.longrunning.Operation, request, callback);
                }, "name", { value: "GetOperation" });
    
                /**
                 * Calls GetOperation.
                 * @function getOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IGetOperationRequest} request GetOperationRequest message or plain object
                 * @returns {Promise<google.longrunning.Operation>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|deleteOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef DeleteOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.protobuf.Empty} [response] Empty
                 */
    
                /**
                 * Calls DeleteOperation.
                 * @function deleteOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IDeleteOperationRequest} request DeleteOperationRequest message or plain object
                 * @param {google.longrunning.Operations.DeleteOperationCallback} callback Node-style callback called with the error, if any, and Empty
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.deleteOperation = function deleteOperation(request, callback) {
                    return this.rpcCall(deleteOperation, $root.google.longrunning.DeleteOperationRequest, $root.google.protobuf.Empty, request, callback);
                }, "name", { value: "DeleteOperation" });
    
                /**
                 * Calls DeleteOperation.
                 * @function deleteOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IDeleteOperationRequest} request DeleteOperationRequest message or plain object
                 * @returns {Promise<google.protobuf.Empty>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|cancelOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef CancelOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.protobuf.Empty} [response] Empty
                 */
    
                /**
                 * Calls CancelOperation.
                 * @function cancelOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.ICancelOperationRequest} request CancelOperationRequest message or plain object
                 * @param {google.longrunning.Operations.CancelOperationCallback} callback Node-style callback called with the error, if any, and Empty
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.cancelOperation = function cancelOperation(request, callback) {
                    return this.rpcCall(cancelOperation, $root.google.longrunning.CancelOperationRequest, $root.google.protobuf.Empty, request, callback);
                }, "name", { value: "CancelOperation" });
    
                /**
                 * Calls CancelOperation.
                 * @function cancelOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.ICancelOperationRequest} request CancelOperationRequest message or plain object
                 * @returns {Promise<google.protobuf.Empty>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|waitOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef WaitOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.Operation} [response] Operation
                 */
    
                /**
                 * Calls WaitOperation.
                 * @function waitOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IWaitOperationRequest} request WaitOperationRequest message or plain object
                 * @param {google.longrunning.Operations.WaitOperationCallback} callback Node-style callback called with the error, if any, and Operation
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.waitOperation = function waitOperation(request, callback) {
                    return this.rpcCall(waitOperation, $root.google.longrunning.WaitOperationRequest, $root.google.longrunning.Operation, request, callback);
                }, "name", { value: "WaitOperation" });
    
                /**
                 * Calls WaitOperation.
                 * @function waitOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IWaitOperationRequest} request WaitOperationRequest message or plain object
                 * @returns {Promise<google.longrunning.Operation>} Promise
                 * @variation 2
                 */
    
                return Operations;
            })();
    
            longrunning.Operation = (function() {
    
                /**
                 * Properties of an Operation.
                 * @memberof google.longrunning
                 * @interface IOperation
                 * @property {string|null} [name] Operation name
                 * @property {google.protobuf.IAny|null} [metadata] Operation metadata
                 * @property {boolean|null} [done] Operation done
                 * @property {google.rpc.IStatus|null} [error] Operation error
                 * @property {google.protobuf.IAny|null} [response] Operation response
                 */
    
                /**
                 * Constructs a new Operation.
                 * @memberof google.longrunning
                 * @classdesc Represents an Operation.
                 * @implements IOperation
                 * @constructor
                 * @param {google.longrunning.IOperation=} [properties] Properties to set
                 */
                function Operation(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Operation name.
                 * @member {string} name
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.name = "";
    
                /**
                 * Operation metadata.
                 * @member {google.protobuf.IAny|null|undefined} metadata
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.metadata = null;
    
                /**
                 * Operation done.
                 * @member {boolean} done
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.done = false;
    
                /**
                 * Operation error.
                 * @member {google.rpc.IStatus|null|undefined} error
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.error = null;
    
                /**
                 * Operation response.
                 * @member {google.protobuf.IAny|null|undefined} response
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.response = null;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * Operation result.
                 * @member {"error"|"response"|undefined} result
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Object.defineProperty(Operation.prototype, "result", {
                    get: $util.oneOfGetter($oneOfFields = ["error", "response"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new Operation instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation=} [properties] Properties to set
                 * @returns {google.longrunning.Operation} Operation instance
                 */
                Operation.create = function create(properties) {
                    return new Operation(properties);
                };
    
                /**
                 * Encodes the specified Operation message. Does not implicitly {@link google.longrunning.Operation.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation} message Operation message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Operation.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                        $root.google.protobuf.Any.encode(message.metadata, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.done);
                    if (message.error != null && Object.hasOwnProperty.call(message, "error"))
                        $root.google.rpc.Status.encode(message.error, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.response != null && Object.hasOwnProperty.call(message, "response"))
                        $root.google.protobuf.Any.encode(message.response, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Operation message, length delimited. Does not implicitly {@link google.longrunning.Operation.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation} message Operation message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Operation.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Operation message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.Operation} Operation
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Operation.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.Operation();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message.metadata = $root.google.protobuf.Any.decode(reader, reader.uint32());
                                break;
                            }
                        case 3: {
                                message.done = reader.bool();
                                break;
                            }
                        case 4: {
                                message.error = $root.google.rpc.Status.decode(reader, reader.uint32());
                                break;
                            }
                        case 5: {
                                message.response = $root.google.protobuf.Any.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Operation message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.Operation} Operation
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Operation.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Operation message.
                 * @function verify
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Operation.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.metadata != null && message.hasOwnProperty("metadata")) {
                        var error = $root.google.protobuf.Any.verify(message.metadata);
                        if (error)
                            return "metadata." + error;
                    }
                    if (message.done != null && message.hasOwnProperty("done"))
                        if (typeof message.done !== "boolean")
                            return "done: boolean expected";
                    if (message.error != null && message.hasOwnProperty("error")) {
                        properties.result = 1;
                        {
                            var error = $root.google.rpc.Status.verify(message.error);
                            if (error)
                                return "error." + error;
                        }
                    }
                    if (message.response != null && message.hasOwnProperty("response")) {
                        if (properties.result === 1)
                            return "result: multiple values";
                        properties.result = 1;
                        {
                            var error = $root.google.protobuf.Any.verify(message.response);
                            if (error)
                                return "response." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an Operation message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.Operation} Operation
                 */
                Operation.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.Operation)
                        return object;
                    var message = new $root.google.longrunning.Operation();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.metadata != null) {
                        if (typeof object.metadata !== "object")
                            throw TypeError(".google.longrunning.Operation.metadata: object expected");
                        message.metadata = $root.google.protobuf.Any.fromObject(object.metadata);
                    }
                    if (object.done != null)
                        message.done = Boolean(object.done);
                    if (object.error != null) {
                        if (typeof object.error !== "object")
                            throw TypeError(".google.longrunning.Operation.error: object expected");
                        message.error = $root.google.rpc.Status.fromObject(object.error);
                    }
                    if (object.response != null) {
                        if (typeof object.response !== "object")
                            throw TypeError(".google.longrunning.Operation.response: object expected");
                        message.response = $root.google.protobuf.Any.fromObject(object.response);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an Operation message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.Operation} message Operation
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Operation.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.metadata = null;
                        object.done = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.metadata != null && message.hasOwnProperty("metadata"))
                        object.metadata = $root.google.protobuf.Any.toObject(message.metadata, options);
                    if (message.done != null && message.hasOwnProperty("done"))
                        object.done = message.done;
                    if (message.error != null && message.hasOwnProperty("error")) {
                        object.error = $root.google.rpc.Status.toObject(message.error, options);
                        if (options.oneofs)
                            object.result = "error";
                    }
                    if (message.response != null && message.hasOwnProperty("response")) {
                        object.response = $root.google.protobuf.Any.toObject(message.response, options);
                        if (options.oneofs)
                            object.result = "response";
                    }
                    return object;
                };
    
                /**
                 * Converts this Operation to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.Operation
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Operation.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Operation
                 * @function getTypeUrl
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Operation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.Operation";
                };
    
                return Operation;
            })();
    
            longrunning.GetOperationRequest = (function() {
    
                /**
                 * Properties of a GetOperationRequest.
                 * @memberof google.longrunning
                 * @interface IGetOperationRequest
                 * @property {string|null} [name] GetOperationRequest name
                 */
    
                /**
                 * Constructs a new GetOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a GetOperationRequest.
                 * @implements IGetOperationRequest
                 * @constructor
                 * @param {google.longrunning.IGetOperationRequest=} [properties] Properties to set
                 */
                function GetOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * GetOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.GetOperationRequest
                 * @instance
                 */
                GetOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new GetOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest instance
                 */
                GetOperationRequest.create = function create(properties) {
                    return new GetOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified GetOperationRequest message. Does not implicitly {@link google.longrunning.GetOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest} message GetOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GetOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified GetOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.GetOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest} message GetOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GetOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a GetOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GetOperationRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.GetOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a GetOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GetOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a GetOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                GetOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a GetOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 */
                GetOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.GetOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.GetOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a GetOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.GetOperationRequest} message GetOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                GetOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this GetOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.GetOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                GetOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for GetOperationRequest
                 * @function getTypeUrl
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                GetOperationRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.GetOperationRequest";
                };
    
                return GetOperationRequest;
            })();
    
            longrunning.ListOperationsRequest = (function() {
    
                /**
                 * Properties of a ListOperationsRequest.
                 * @memberof google.longrunning
                 * @interface IListOperationsRequest
                 * @property {string|null} [name] ListOperationsRequest name
                 * @property {string|null} [filter] ListOperationsRequest filter
                 * @property {number|null} [pageSize] ListOperationsRequest pageSize
                 * @property {string|null} [pageToken] ListOperationsRequest pageToken
                 */
    
                /**
                 * Constructs a new ListOperationsRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a ListOperationsRequest.
                 * @implements IListOperationsRequest
                 * @constructor
                 * @param {google.longrunning.IListOperationsRequest=} [properties] Properties to set
                 */
                function ListOperationsRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListOperationsRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.name = "";
    
                /**
                 * ListOperationsRequest filter.
                 * @member {string} filter
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.filter = "";
    
                /**
                 * ListOperationsRequest pageSize.
                 * @member {number} pageSize
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.pageSize = 0;
    
                /**
                 * ListOperationsRequest pageToken.
                 * @member {string} pageToken
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.pageToken = "";
    
                /**
                 * Creates a new ListOperationsRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest=} [properties] Properties to set
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest instance
                 */
                ListOperationsRequest.create = function create(properties) {
                    return new ListOperationsRequest(properties);
                };
    
                /**
                 * Encodes the specified ListOperationsRequest message. Does not implicitly {@link google.longrunning.ListOperationsRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest} message ListOperationsRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.filter);
                    if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                    if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified ListOperationsRequest message, length delimited. Does not implicitly {@link google.longrunning.ListOperationsRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest} message ListOperationsRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListOperationsRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.ListOperationsRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 4: {
                                message.name = reader.string();
                                break;
                            }
                        case 1: {
                                message.filter = reader.string();
                                break;
                            }
                        case 2: {
                                message.pageSize = reader.int32();
                                break;
                            }
                        case 3: {
                                message.pageToken = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListOperationsRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListOperationsRequest message.
                 * @function verify
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListOperationsRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.filter != null && message.hasOwnProperty("filter"))
                        if (!$util.isString(message.filter))
                            return "filter: string expected";
                    if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                        if (!$util.isInteger(message.pageSize))
                            return "pageSize: integer expected";
                    if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                        if (!$util.isString(message.pageToken))
                            return "pageToken: string expected";
                    return null;
                };
    
                /**
                 * Creates a ListOperationsRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 */
                ListOperationsRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.ListOperationsRequest)
                        return object;
                    var message = new $root.google.longrunning.ListOperationsRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.filter != null)
                        message.filter = String(object.filter);
                    if (object.pageSize != null)
                        message.pageSize = object.pageSize | 0;
                    if (object.pageToken != null)
                        message.pageToken = String(object.pageToken);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListOperationsRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.ListOperationsRequest} message ListOperationsRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListOperationsRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.filter = "";
                        object.pageSize = 0;
                        object.pageToken = "";
                        object.name = "";
                    }
                    if (message.filter != null && message.hasOwnProperty("filter"))
                        object.filter = message.filter;
                    if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                        object.pageSize = message.pageSize;
                    if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                        object.pageToken = message.pageToken;
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this ListOperationsRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListOperationsRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ListOperationsRequest
                 * @function getTypeUrl
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ListOperationsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.ListOperationsRequest";
                };
    
                return ListOperationsRequest;
            })();
    
            longrunning.ListOperationsResponse = (function() {
    
                /**
                 * Properties of a ListOperationsResponse.
                 * @memberof google.longrunning
                 * @interface IListOperationsResponse
                 * @property {Array.<google.longrunning.IOperation>|null} [operations] ListOperationsResponse operations
                 * @property {string|null} [nextPageToken] ListOperationsResponse nextPageToken
                 */
    
                /**
                 * Constructs a new ListOperationsResponse.
                 * @memberof google.longrunning
                 * @classdesc Represents a ListOperationsResponse.
                 * @implements IListOperationsResponse
                 * @constructor
                 * @param {google.longrunning.IListOperationsResponse=} [properties] Properties to set
                 */
                function ListOperationsResponse(properties) {
                    this.operations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListOperationsResponse operations.
                 * @member {Array.<google.longrunning.IOperation>} operations
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 */
                ListOperationsResponse.prototype.operations = $util.emptyArray;
    
                /**
                 * ListOperationsResponse nextPageToken.
                 * @member {string} nextPageToken
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 */
                ListOperationsResponse.prototype.nextPageToken = "";
    
                /**
                 * Creates a new ListOperationsResponse instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse=} [properties] Properties to set
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse instance
                 */
                ListOperationsResponse.create = function create(properties) {
                    return new ListOperationsResponse(properties);
                };
    
                /**
                 * Encodes the specified ListOperationsResponse message. Does not implicitly {@link google.longrunning.ListOperationsResponse.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse} message ListOperationsResponse message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsResponse.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.operations != null && message.operations.length)
                        for (var i = 0; i < message.operations.length; ++i)
                            $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                    return writer;
                };
    
                /**
                 * Encodes the specified ListOperationsResponse message, length delimited. Does not implicitly {@link google.longrunning.ListOperationsResponse.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse} message ListOperationsResponse message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListOperationsResponse message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsResponse.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.ListOperationsResponse();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                if (!(message.operations && message.operations.length))
                                    message.operations = [];
                                message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                                break;
                            }
                        case 2: {
                                message.nextPageToken = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListOperationsResponse message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListOperationsResponse message.
                 * @function verify
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListOperationsResponse.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.operations != null && message.hasOwnProperty("operations")) {
                        if (!Array.isArray(message.operations))
                            return "operations: array expected";
                        for (var i = 0; i < message.operations.length; ++i) {
                            var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                            if (error)
                                return "operations." + error;
                        }
                    }
                    if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                        if (!$util.isString(message.nextPageToken))
                            return "nextPageToken: string expected";
                    return null;
                };
    
                /**
                 * Creates a ListOperationsResponse message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 */
                ListOperationsResponse.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.ListOperationsResponse)
                        return object;
                    var message = new $root.google.longrunning.ListOperationsResponse();
                    if (object.operations) {
                        if (!Array.isArray(object.operations))
                            throw TypeError(".google.longrunning.ListOperationsResponse.operations: array expected");
                        message.operations = [];
                        for (var i = 0; i < object.operations.length; ++i) {
                            if (typeof object.operations[i] !== "object")
                                throw TypeError(".google.longrunning.ListOperationsResponse.operations: object expected");
                            message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                        }
                    }
                    if (object.nextPageToken != null)
                        message.nextPageToken = String(object.nextPageToken);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListOperationsResponse message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.ListOperationsResponse} message ListOperationsResponse
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListOperationsResponse.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.operations = [];
                    if (options.defaults)
                        object.nextPageToken = "";
                    if (message.operations && message.operations.length) {
                        object.operations = [];
                        for (var j = 0; j < message.operations.length; ++j)
                            object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                    }
                    if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                        object.nextPageToken = message.nextPageToken;
                    return object;
                };
    
                /**
                 * Converts this ListOperationsResponse to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListOperationsResponse.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for ListOperationsResponse
                 * @function getTypeUrl
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                ListOperationsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.ListOperationsResponse";
                };
    
                return ListOperationsResponse;
            })();
    
            longrunning.CancelOperationRequest = (function() {
    
                /**
                 * Properties of a CancelOperationRequest.
                 * @memberof google.longrunning
                 * @interface ICancelOperationRequest
                 * @property {string|null} [name] CancelOperationRequest name
                 */
    
                /**
                 * Constructs a new CancelOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a CancelOperationRequest.
                 * @implements ICancelOperationRequest
                 * @constructor
                 * @param {google.longrunning.ICancelOperationRequest=} [properties] Properties to set
                 */
                function CancelOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CancelOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.CancelOperationRequest
                 * @instance
                 */
                CancelOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new CancelOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest instance
                 */
                CancelOperationRequest.create = function create(properties) {
                    return new CancelOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified CancelOperationRequest message. Does not implicitly {@link google.longrunning.CancelOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest} message CancelOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CancelOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified CancelOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.CancelOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest} message CancelOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CancelOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CancelOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CancelOperationRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.CancelOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CancelOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CancelOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CancelOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CancelOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a CancelOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 */
                CancelOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.CancelOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.CancelOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a CancelOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.CancelOperationRequest} message CancelOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CancelOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this CancelOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.CancelOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CancelOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for CancelOperationRequest
                 * @function getTypeUrl
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                CancelOperationRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.CancelOperationRequest";
                };
    
                return CancelOperationRequest;
            })();
    
            longrunning.DeleteOperationRequest = (function() {
    
                /**
                 * Properties of a DeleteOperationRequest.
                 * @memberof google.longrunning
                 * @interface IDeleteOperationRequest
                 * @property {string|null} [name] DeleteOperationRequest name
                 */
    
                /**
                 * Constructs a new DeleteOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a DeleteOperationRequest.
                 * @implements IDeleteOperationRequest
                 * @constructor
                 * @param {google.longrunning.IDeleteOperationRequest=} [properties] Properties to set
                 */
                function DeleteOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DeleteOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @instance
                 */
                DeleteOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new DeleteOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest instance
                 */
                DeleteOperationRequest.create = function create(properties) {
                    return new DeleteOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified DeleteOperationRequest message. Does not implicitly {@link google.longrunning.DeleteOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest} message DeleteOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DeleteOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified DeleteOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.DeleteOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest} message DeleteOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DeleteOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DeleteOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DeleteOperationRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.DeleteOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DeleteOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DeleteOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DeleteOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DeleteOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a DeleteOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 */
                DeleteOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.DeleteOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.DeleteOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a DeleteOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.DeleteOperationRequest} message DeleteOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DeleteOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this DeleteOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DeleteOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for DeleteOperationRequest
                 * @function getTypeUrl
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                DeleteOperationRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.DeleteOperationRequest";
                };
    
                return DeleteOperationRequest;
            })();
    
            longrunning.WaitOperationRequest = (function() {
    
                /**
                 * Properties of a WaitOperationRequest.
                 * @memberof google.longrunning
                 * @interface IWaitOperationRequest
                 * @property {string|null} [name] WaitOperationRequest name
                 * @property {google.protobuf.IDuration|null} [timeout] WaitOperationRequest timeout
                 */
    
                /**
                 * Constructs a new WaitOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a WaitOperationRequest.
                 * @implements IWaitOperationRequest
                 * @constructor
                 * @param {google.longrunning.IWaitOperationRequest=} [properties] Properties to set
                 */
                function WaitOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * WaitOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 */
                WaitOperationRequest.prototype.name = "";
    
                /**
                 * WaitOperationRequest timeout.
                 * @member {google.protobuf.IDuration|null|undefined} timeout
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 */
                WaitOperationRequest.prototype.timeout = null;
    
                /**
                 * Creates a new WaitOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest instance
                 */
                WaitOperationRequest.create = function create(properties) {
                    return new WaitOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified WaitOperationRequest message. Does not implicitly {@link google.longrunning.WaitOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest} message WaitOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                WaitOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.timeout != null && Object.hasOwnProperty.call(message, "timeout"))
                        $root.google.protobuf.Duration.encode(message.timeout, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified WaitOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.WaitOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest} message WaitOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                WaitOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a WaitOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                WaitOperationRequest.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.WaitOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.name = reader.string();
                                break;
                            }
                        case 2: {
                                message.timeout = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a WaitOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                WaitOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a WaitOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                WaitOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.timeout != null && message.hasOwnProperty("timeout")) {
                        var error = $root.google.protobuf.Duration.verify(message.timeout);
                        if (error)
                            return "timeout." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a WaitOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 */
                WaitOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.WaitOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.WaitOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.timeout != null) {
                        if (typeof object.timeout !== "object")
                            throw TypeError(".google.longrunning.WaitOperationRequest.timeout: object expected");
                        message.timeout = $root.google.protobuf.Duration.fromObject(object.timeout);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a WaitOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.WaitOperationRequest} message WaitOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                WaitOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.timeout = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.timeout != null && message.hasOwnProperty("timeout"))
                        object.timeout = $root.google.protobuf.Duration.toObject(message.timeout, options);
                    return object;
                };
    
                /**
                 * Converts this WaitOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                WaitOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for WaitOperationRequest
                 * @function getTypeUrl
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                WaitOperationRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.WaitOperationRequest";
                };
    
                return WaitOperationRequest;
            })();
    
            longrunning.OperationInfo = (function() {
    
                /**
                 * Properties of an OperationInfo.
                 * @memberof google.longrunning
                 * @interface IOperationInfo
                 * @property {string|null} [responseType] OperationInfo responseType
                 * @property {string|null} [metadataType] OperationInfo metadataType
                 */
    
                /**
                 * Constructs a new OperationInfo.
                 * @memberof google.longrunning
                 * @classdesc Represents an OperationInfo.
                 * @implements IOperationInfo
                 * @constructor
                 * @param {google.longrunning.IOperationInfo=} [properties] Properties to set
                 */
                function OperationInfo(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OperationInfo responseType.
                 * @member {string} responseType
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 */
                OperationInfo.prototype.responseType = "";
    
                /**
                 * OperationInfo metadataType.
                 * @member {string} metadataType
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 */
                OperationInfo.prototype.metadataType = "";
    
                /**
                 * Creates a new OperationInfo instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo=} [properties] Properties to set
                 * @returns {google.longrunning.OperationInfo} OperationInfo instance
                 */
                OperationInfo.create = function create(properties) {
                    return new OperationInfo(properties);
                };
    
                /**
                 * Encodes the specified OperationInfo message. Does not implicitly {@link google.longrunning.OperationInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo} message OperationInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OperationInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.responseType != null && Object.hasOwnProperty.call(message, "responseType"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.responseType);
                    if (message.metadataType != null && Object.hasOwnProperty.call(message, "metadataType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.metadataType);
                    return writer;
                };
    
                /**
                 * Encodes the specified OperationInfo message, length delimited. Does not implicitly {@link google.longrunning.OperationInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo} message OperationInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OperationInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OperationInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OperationInfo.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.OperationInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.responseType = reader.string();
                                break;
                            }
                        case 2: {
                                message.metadataType = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OperationInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OperationInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OperationInfo message.
                 * @function verify
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OperationInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.responseType != null && message.hasOwnProperty("responseType"))
                        if (!$util.isString(message.responseType))
                            return "responseType: string expected";
                    if (message.metadataType != null && message.hasOwnProperty("metadataType"))
                        if (!$util.isString(message.metadataType))
                            return "metadataType: string expected";
                    return null;
                };
    
                /**
                 * Creates an OperationInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 */
                OperationInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.OperationInfo)
                        return object;
                    var message = new $root.google.longrunning.OperationInfo();
                    if (object.responseType != null)
                        message.responseType = String(object.responseType);
                    if (object.metadataType != null)
                        message.metadataType = String(object.metadataType);
                    return message;
                };
    
                /**
                 * Creates a plain object from an OperationInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.OperationInfo} message OperationInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OperationInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.responseType = "";
                        object.metadataType = "";
                    }
                    if (message.responseType != null && message.hasOwnProperty("responseType"))
                        object.responseType = message.responseType;
                    if (message.metadataType != null && message.hasOwnProperty("metadataType"))
                        object.metadataType = message.metadataType;
                    return object;
                };
    
                /**
                 * Converts this OperationInfo to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OperationInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for OperationInfo
                 * @function getTypeUrl
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                OperationInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.longrunning.OperationInfo";
                };
    
                return OperationInfo;
            })();
    
            return longrunning;
        })();
    
        google.iam = (function() {
    
            /**
             * Namespace iam.
             * @memberof google
             * @namespace
             */
            var iam = {};
    
            iam.v1 = (function() {
    
                /**
                 * Namespace v1.
                 * @memberof google.iam
                 * @namespace
                 */
                var v1 = {};
    
                v1.IAMPolicy = (function() {
    
                    /**
                     * Constructs a new IAMPolicy service.
                     * @memberof google.iam.v1
                     * @classdesc Represents a IAMPolicy
                     * @extends $protobuf.rpc.Service
                     * @constructor
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     */
                    function IAMPolicy(rpcImpl, requestDelimited, responseDelimited) {
                        $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                    }
    
                    (IAMPolicy.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = IAMPolicy;
    
                    /**
                     * Creates new IAMPolicy service using the specified rpc implementation.
                     * @function create
                     * @memberof google.iam.v1.IAMPolicy
                     * @static
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     * @returns {IAMPolicy} RPC service. Useful where requests and/or responses are streamed.
                     */
                    IAMPolicy.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                        return new this(rpcImpl, requestDelimited, responseDelimited);
                    };
    
                    /**
                     * Callback as used by {@link google.iam.v1.IAMPolicy|setIamPolicy}.
                     * @memberof google.iam.v1.IAMPolicy
                     * @typedef SetIamPolicyCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.iam.v1.Policy} [response] Policy
                     */
    
                    /**
                     * Calls SetIamPolicy.
                     * @function setIamPolicy
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                     * @param {google.iam.v1.IAMPolicy.SetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(IAMPolicy.prototype.setIamPolicy = function setIamPolicy(request, callback) {
                        return this.rpcCall(setIamPolicy, $root.google.iam.v1.SetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                    }, "name", { value: "SetIamPolicy" });
    
                    /**
                     * Calls SetIamPolicy.
                     * @function setIamPolicy
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.ISetIamPolicyRequest} request SetIamPolicyRequest message or plain object
                     * @returns {Promise<google.iam.v1.Policy>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.iam.v1.IAMPolicy|getIamPolicy}.
                     * @memberof google.iam.v1.IAMPolicy
                     * @typedef GetIamPolicyCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.iam.v1.Policy} [response] Policy
                     */
    
                    /**
                     * Calls GetIamPolicy.
                     * @function getIamPolicy
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                     * @param {google.iam.v1.IAMPolicy.GetIamPolicyCallback} callback Node-style callback called with the error, if any, and Policy
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(IAMPolicy.prototype.getIamPolicy = function getIamPolicy(request, callback) {
                        return this.rpcCall(getIamPolicy, $root.google.iam.v1.GetIamPolicyRequest, $root.google.iam.v1.Policy, request, callback);
                    }, "name", { value: "GetIamPolicy" });
    
                    /**
                     * Calls GetIamPolicy.
                     * @function getIamPolicy
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.IGetIamPolicyRequest} request GetIamPolicyRequest message or plain object
                     * @returns {Promise<google.iam.v1.Policy>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.iam.v1.IAMPolicy|testIamPermissions}.
                     * @memberof google.iam.v1.IAMPolicy
                     * @typedef TestIamPermissionsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.iam.v1.TestIamPermissionsResponse} [response] TestIamPermissionsResponse
                     */
    
                    /**
                     * Calls TestIamPermissions.
                     * @function testIamPermissions
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                     * @param {google.iam.v1.IAMPolicy.TestIamPermissionsCallback} callback Node-style callback called with the error, if any, and TestIamPermissionsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(IAMPolicy.prototype.testIamPermissions = function testIamPermissions(request, callback) {
                        return this.rpcCall(testIamPermissions, $root.google.iam.v1.TestIamPermissionsRequest, $root.google.iam.v1.TestIamPermissionsResponse, request, callback);
                    }, "name", { value: "TestIamPermissions" });
    
                    /**
                     * Calls TestIamPermissions.
                     * @function testIamPermissions
                     * @memberof google.iam.v1.IAMPolicy
                     * @instance
                     * @param {google.iam.v1.ITestIamPermissionsRequest} request TestIamPermissionsRequest message or plain object
                     * @returns {Promise<google.iam.v1.TestIamPermissionsResponse>} Promise
                     * @variation 2
                     */
    
                    return IAMPolicy;
                })();
    
                v1.SetIamPolicyRequest = (function() {
    
                    /**
                     * Properties of a SetIamPolicyRequest.
                     * @memberof google.iam.v1
                     * @interface ISetIamPolicyRequest
                     * @property {string|null} [resource] SetIamPolicyRequest resource
                     * @property {google.iam.v1.IPolicy|null} [policy] SetIamPolicyRequest policy
                     * @property {google.protobuf.IFieldMask|null} [updateMask] SetIamPolicyRequest updateMask
                     */
    
                    /**
                     * Constructs a new SetIamPolicyRequest.
                     * @memberof google.iam.v1
                     * @classdesc Represents a SetIamPolicyRequest.
                     * @implements ISetIamPolicyRequest
                     * @constructor
                     * @param {google.iam.v1.ISetIamPolicyRequest=} [properties] Properties to set
                     */
                    function SetIamPolicyRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * SetIamPolicyRequest resource.
                     * @member {string} resource
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @instance
                     */
                    SetIamPolicyRequest.prototype.resource = "";
    
                    /**
                     * SetIamPolicyRequest policy.
                     * @member {google.iam.v1.IPolicy|null|undefined} policy
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @instance
                     */
                    SetIamPolicyRequest.prototype.policy = null;
    
                    /**
                     * SetIamPolicyRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @instance
                     */
                    SetIamPolicyRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new SetIamPolicyRequest instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.ISetIamPolicyRequest=} [properties] Properties to set
                     * @returns {google.iam.v1.SetIamPolicyRequest} SetIamPolicyRequest instance
                     */
                    SetIamPolicyRequest.create = function create(properties) {
                        return new SetIamPolicyRequest(properties);
                    };
    
                    /**
                     * Encodes the specified SetIamPolicyRequest message. Does not implicitly {@link google.iam.v1.SetIamPolicyRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.ISetIamPolicyRequest} message SetIamPolicyRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    SetIamPolicyRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resource != null && Object.hasOwnProperty.call(message, "resource"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.resource);
                        if (message.policy != null && Object.hasOwnProperty.call(message, "policy"))
                            $root.google.iam.v1.Policy.encode(message.policy, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified SetIamPolicyRequest message, length delimited. Does not implicitly {@link google.iam.v1.SetIamPolicyRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.ISetIamPolicyRequest} message SetIamPolicyRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    SetIamPolicyRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a SetIamPolicyRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.SetIamPolicyRequest} SetIamPolicyRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    SetIamPolicyRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.SetIamPolicyRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.resource = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.policy = $root.google.iam.v1.Policy.decode(reader, reader.uint32());
                                    break;
                                }
                            case 3: {
                                    message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a SetIamPolicyRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.SetIamPolicyRequest} SetIamPolicyRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    SetIamPolicyRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a SetIamPolicyRequest message.
                     * @function verify
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    SetIamPolicyRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            if (!$util.isString(message.resource))
                                return "resource: string expected";
                        if (message.policy != null && message.hasOwnProperty("policy")) {
                            var error = $root.google.iam.v1.Policy.verify(message.policy);
                            if (error)
                                return "policy." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a SetIamPolicyRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.SetIamPolicyRequest} SetIamPolicyRequest
                     */
                    SetIamPolicyRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.SetIamPolicyRequest)
                            return object;
                        var message = new $root.google.iam.v1.SetIamPolicyRequest();
                        if (object.resource != null)
                            message.resource = String(object.resource);
                        if (object.policy != null) {
                            if (typeof object.policy !== "object")
                                throw TypeError(".google.iam.v1.SetIamPolicyRequest.policy: object expected");
                            message.policy = $root.google.iam.v1.Policy.fromObject(object.policy);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.iam.v1.SetIamPolicyRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a SetIamPolicyRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.SetIamPolicyRequest} message SetIamPolicyRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    SetIamPolicyRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.resource = "";
                            object.policy = null;
                            object.updateMask = null;
                        }
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            object.resource = message.resource;
                        if (message.policy != null && message.hasOwnProperty("policy"))
                            object.policy = $root.google.iam.v1.Policy.toObject(message.policy, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this SetIamPolicyRequest to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    SetIamPolicyRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for SetIamPolicyRequest
                     * @function getTypeUrl
                     * @memberof google.iam.v1.SetIamPolicyRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    SetIamPolicyRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.SetIamPolicyRequest";
                    };
    
                    return SetIamPolicyRequest;
                })();
    
                v1.GetIamPolicyRequest = (function() {
    
                    /**
                     * Properties of a GetIamPolicyRequest.
                     * @memberof google.iam.v1
                     * @interface IGetIamPolicyRequest
                     * @property {string|null} [resource] GetIamPolicyRequest resource
                     * @property {google.iam.v1.IGetPolicyOptions|null} [options] GetIamPolicyRequest options
                     */
    
                    /**
                     * Constructs a new GetIamPolicyRequest.
                     * @memberof google.iam.v1
                     * @classdesc Represents a GetIamPolicyRequest.
                     * @implements IGetIamPolicyRequest
                     * @constructor
                     * @param {google.iam.v1.IGetIamPolicyRequest=} [properties] Properties to set
                     */
                    function GetIamPolicyRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetIamPolicyRequest resource.
                     * @member {string} resource
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @instance
                     */
                    GetIamPolicyRequest.prototype.resource = "";
    
                    /**
                     * GetIamPolicyRequest options.
                     * @member {google.iam.v1.IGetPolicyOptions|null|undefined} options
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @instance
                     */
                    GetIamPolicyRequest.prototype.options = null;
    
                    /**
                     * Creates a new GetIamPolicyRequest instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.IGetIamPolicyRequest=} [properties] Properties to set
                     * @returns {google.iam.v1.GetIamPolicyRequest} GetIamPolicyRequest instance
                     */
                    GetIamPolicyRequest.create = function create(properties) {
                        return new GetIamPolicyRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetIamPolicyRequest message. Does not implicitly {@link google.iam.v1.GetIamPolicyRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.IGetIamPolicyRequest} message GetIamPolicyRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetIamPolicyRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resource != null && Object.hasOwnProperty.call(message, "resource"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.resource);
                        if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                            $root.google.iam.v1.GetPolicyOptions.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetIamPolicyRequest message, length delimited. Does not implicitly {@link google.iam.v1.GetIamPolicyRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.IGetIamPolicyRequest} message GetIamPolicyRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetIamPolicyRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetIamPolicyRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.GetIamPolicyRequest} GetIamPolicyRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetIamPolicyRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.GetIamPolicyRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.resource = reader.string();
                                    break;
                                }
                            case 2: {
                                    message.options = $root.google.iam.v1.GetPolicyOptions.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetIamPolicyRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.GetIamPolicyRequest} GetIamPolicyRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetIamPolicyRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetIamPolicyRequest message.
                     * @function verify
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetIamPolicyRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            if (!$util.isString(message.resource))
                                return "resource: string expected";
                        if (message.options != null && message.hasOwnProperty("options")) {
                            var error = $root.google.iam.v1.GetPolicyOptions.verify(message.options);
                            if (error)
                                return "options." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a GetIamPolicyRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.GetIamPolicyRequest} GetIamPolicyRequest
                     */
                    GetIamPolicyRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.GetIamPolicyRequest)
                            return object;
                        var message = new $root.google.iam.v1.GetIamPolicyRequest();
                        if (object.resource != null)
                            message.resource = String(object.resource);
                        if (object.options != null) {
                            if (typeof object.options !== "object")
                                throw TypeError(".google.iam.v1.GetIamPolicyRequest.options: object expected");
                            message.options = $root.google.iam.v1.GetPolicyOptions.fromObject(object.options);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetIamPolicyRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {google.iam.v1.GetIamPolicyRequest} message GetIamPolicyRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetIamPolicyRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.resource = "";
                            object.options = null;
                        }
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            object.resource = message.resource;
                        if (message.options != null && message.hasOwnProperty("options"))
                            object.options = $root.google.iam.v1.GetPolicyOptions.toObject(message.options, options);
                        return object;
                    };
    
                    /**
                     * Converts this GetIamPolicyRequest to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetIamPolicyRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for GetIamPolicyRequest
                     * @function getTypeUrl
                     * @memberof google.iam.v1.GetIamPolicyRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    GetIamPolicyRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.GetIamPolicyRequest";
                    };
    
                    return GetIamPolicyRequest;
                })();
    
                v1.TestIamPermissionsRequest = (function() {
    
                    /**
                     * Properties of a TestIamPermissionsRequest.
                     * @memberof google.iam.v1
                     * @interface ITestIamPermissionsRequest
                     * @property {string|null} [resource] TestIamPermissionsRequest resource
                     * @property {Array.<string>|null} [permissions] TestIamPermissionsRequest permissions
                     */
    
                    /**
                     * Constructs a new TestIamPermissionsRequest.
                     * @memberof google.iam.v1
                     * @classdesc Represents a TestIamPermissionsRequest.
                     * @implements ITestIamPermissionsRequest
                     * @constructor
                     * @param {google.iam.v1.ITestIamPermissionsRequest=} [properties] Properties to set
                     */
                    function TestIamPermissionsRequest(properties) {
                        this.permissions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TestIamPermissionsRequest resource.
                     * @member {string} resource
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @instance
                     */
                    TestIamPermissionsRequest.prototype.resource = "";
    
                    /**
                     * TestIamPermissionsRequest permissions.
                     * @member {Array.<string>} permissions
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @instance
                     */
                    TestIamPermissionsRequest.prototype.permissions = $util.emptyArray;
    
                    /**
                     * Creates a new TestIamPermissionsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsRequest=} [properties] Properties to set
                     * @returns {google.iam.v1.TestIamPermissionsRequest} TestIamPermissionsRequest instance
                     */
                    TestIamPermissionsRequest.create = function create(properties) {
                        return new TestIamPermissionsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified TestIamPermissionsRequest message. Does not implicitly {@link google.iam.v1.TestIamPermissionsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsRequest} message TestIamPermissionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TestIamPermissionsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resource != null && Object.hasOwnProperty.call(message, "resource"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.resource);
                        if (message.permissions != null && message.permissions.length)
                            for (var i = 0; i < message.permissions.length; ++i)
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.permissions[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TestIamPermissionsRequest message, length delimited. Does not implicitly {@link google.iam.v1.TestIamPermissionsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsRequest} message TestIamPermissionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TestIamPermissionsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TestIamPermissionsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.TestIamPermissionsRequest} TestIamPermissionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TestIamPermissionsRequest.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.TestIamPermissionsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.resource = reader.string();
                                    break;
                                }
                            case 2: {
                                    if (!(message.permissions && message.permissions.length))
                                        message.permissions = [];
                                    message.permissions.push(reader.string());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TestIamPermissionsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.TestIamPermissionsRequest} TestIamPermissionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TestIamPermissionsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TestIamPermissionsRequest message.
                     * @function verify
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TestIamPermissionsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            if (!$util.isString(message.resource))
                                return "resource: string expected";
                        if (message.permissions != null && message.hasOwnProperty("permissions")) {
                            if (!Array.isArray(message.permissions))
                                return "permissions: array expected";
                            for (var i = 0; i < message.permissions.length; ++i)
                                if (!$util.isString(message.permissions[i]))
                                    return "permissions: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a TestIamPermissionsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.TestIamPermissionsRequest} TestIamPermissionsRequest
                     */
                    TestIamPermissionsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.TestIamPermissionsRequest)
                            return object;
                        var message = new $root.google.iam.v1.TestIamPermissionsRequest();
                        if (object.resource != null)
                            message.resource = String(object.resource);
                        if (object.permissions) {
                            if (!Array.isArray(object.permissions))
                                throw TypeError(".google.iam.v1.TestIamPermissionsRequest.permissions: array expected");
                            message.permissions = [];
                            for (var i = 0; i < object.permissions.length; ++i)
                                message.permissions[i] = String(object.permissions[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TestIamPermissionsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {google.iam.v1.TestIamPermissionsRequest} message TestIamPermissionsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TestIamPermissionsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.permissions = [];
                        if (options.defaults)
                            object.resource = "";
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            object.resource = message.resource;
                        if (message.permissions && message.permissions.length) {
                            object.permissions = [];
                            for (var j = 0; j < message.permissions.length; ++j)
                                object.permissions[j] = message.permissions[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this TestIamPermissionsRequest to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TestIamPermissionsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for TestIamPermissionsRequest
                     * @function getTypeUrl
                     * @memberof google.iam.v1.TestIamPermissionsRequest
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    TestIamPermissionsRequest.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.TestIamPermissionsRequest";
                    };
    
                    return TestIamPermissionsRequest;
                })();
    
                v1.TestIamPermissionsResponse = (function() {
    
                    /**
                     * Properties of a TestIamPermissionsResponse.
                     * @memberof google.iam.v1
                     * @interface ITestIamPermissionsResponse
                     * @property {Array.<string>|null} [permissions] TestIamPermissionsResponse permissions
                     */
    
                    /**
                     * Constructs a new TestIamPermissionsResponse.
                     * @memberof google.iam.v1
                     * @classdesc Represents a TestIamPermissionsResponse.
                     * @implements ITestIamPermissionsResponse
                     * @constructor
                     * @param {google.iam.v1.ITestIamPermissionsResponse=} [properties] Properties to set
                     */
                    function TestIamPermissionsResponse(properties) {
                        this.permissions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TestIamPermissionsResponse permissions.
                     * @member {Array.<string>} permissions
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @instance
                     */
                    TestIamPermissionsResponse.prototype.permissions = $util.emptyArray;
    
                    /**
                     * Creates a new TestIamPermissionsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsResponse=} [properties] Properties to set
                     * @returns {google.iam.v1.TestIamPermissionsResponse} TestIamPermissionsResponse instance
                     */
                    TestIamPermissionsResponse.create = function create(properties) {
                        return new TestIamPermissionsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified TestIamPermissionsResponse message. Does not implicitly {@link google.iam.v1.TestIamPermissionsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsResponse} message TestIamPermissionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TestIamPermissionsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.permissions != null && message.permissions.length)
                            for (var i = 0; i < message.permissions.length; ++i)
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.permissions[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TestIamPermissionsResponse message, length delimited. Does not implicitly {@link google.iam.v1.TestIamPermissionsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {google.iam.v1.ITestIamPermissionsResponse} message TestIamPermissionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TestIamPermissionsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TestIamPermissionsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.TestIamPermissionsResponse} TestIamPermissionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TestIamPermissionsResponse.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.TestIamPermissionsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.permissions && message.permissions.length))
                                        message.permissions = [];
                                    message.permissions.push(reader.string());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TestIamPermissionsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.TestIamPermissionsResponse} TestIamPermissionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TestIamPermissionsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TestIamPermissionsResponse message.
                     * @function verify
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TestIamPermissionsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.permissions != null && message.hasOwnProperty("permissions")) {
                            if (!Array.isArray(message.permissions))
                                return "permissions: array expected";
                            for (var i = 0; i < message.permissions.length; ++i)
                                if (!$util.isString(message.permissions[i]))
                                    return "permissions: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a TestIamPermissionsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.TestIamPermissionsResponse} TestIamPermissionsResponse
                     */
                    TestIamPermissionsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.TestIamPermissionsResponse)
                            return object;
                        var message = new $root.google.iam.v1.TestIamPermissionsResponse();
                        if (object.permissions) {
                            if (!Array.isArray(object.permissions))
                                throw TypeError(".google.iam.v1.TestIamPermissionsResponse.permissions: array expected");
                            message.permissions = [];
                            for (var i = 0; i < object.permissions.length; ++i)
                                message.permissions[i] = String(object.permissions[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TestIamPermissionsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {google.iam.v1.TestIamPermissionsResponse} message TestIamPermissionsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TestIamPermissionsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.permissions = [];
                        if (message.permissions && message.permissions.length) {
                            object.permissions = [];
                            for (var j = 0; j < message.permissions.length; ++j)
                                object.permissions[j] = message.permissions[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this TestIamPermissionsResponse to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TestIamPermissionsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for TestIamPermissionsResponse
                     * @function getTypeUrl
                     * @memberof google.iam.v1.TestIamPermissionsResponse
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    TestIamPermissionsResponse.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.TestIamPermissionsResponse";
                    };
    
                    return TestIamPermissionsResponse;
                })();
    
                v1.GetPolicyOptions = (function() {
    
                    /**
                     * Properties of a GetPolicyOptions.
                     * @memberof google.iam.v1
                     * @interface IGetPolicyOptions
                     * @property {number|null} [requestedPolicyVersion] GetPolicyOptions requestedPolicyVersion
                     */
    
                    /**
                     * Constructs a new GetPolicyOptions.
                     * @memberof google.iam.v1
                     * @classdesc Represents a GetPolicyOptions.
                     * @implements IGetPolicyOptions
                     * @constructor
                     * @param {google.iam.v1.IGetPolicyOptions=} [properties] Properties to set
                     */
                    function GetPolicyOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetPolicyOptions requestedPolicyVersion.
                     * @member {number} requestedPolicyVersion
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @instance
                     */
                    GetPolicyOptions.prototype.requestedPolicyVersion = 0;
    
                    /**
                     * Creates a new GetPolicyOptions instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {google.iam.v1.IGetPolicyOptions=} [properties] Properties to set
                     * @returns {google.iam.v1.GetPolicyOptions} GetPolicyOptions instance
                     */
                    GetPolicyOptions.create = function create(properties) {
                        return new GetPolicyOptions(properties);
                    };
    
                    /**
                     * Encodes the specified GetPolicyOptions message. Does not implicitly {@link google.iam.v1.GetPolicyOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {google.iam.v1.IGetPolicyOptions} message GetPolicyOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetPolicyOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.requestedPolicyVersion != null && Object.hasOwnProperty.call(message, "requestedPolicyVersion"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.requestedPolicyVersion);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetPolicyOptions message, length delimited. Does not implicitly {@link google.iam.v1.GetPolicyOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {google.iam.v1.IGetPolicyOptions} message GetPolicyOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetPolicyOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetPolicyOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.GetPolicyOptions} GetPolicyOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetPolicyOptions.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.GetPolicyOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.requestedPolicyVersion = reader.int32();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetPolicyOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.GetPolicyOptions} GetPolicyOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetPolicyOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetPolicyOptions message.
                     * @function verify
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetPolicyOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.requestedPolicyVersion != null && message.hasOwnProperty("requestedPolicyVersion"))
                            if (!$util.isInteger(message.requestedPolicyVersion))
                                return "requestedPolicyVersion: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetPolicyOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.GetPolicyOptions} GetPolicyOptions
                     */
                    GetPolicyOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.GetPolicyOptions)
                            return object;
                        var message = new $root.google.iam.v1.GetPolicyOptions();
                        if (object.requestedPolicyVersion != null)
                            message.requestedPolicyVersion = object.requestedPolicyVersion | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetPolicyOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {google.iam.v1.GetPolicyOptions} message GetPolicyOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetPolicyOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.requestedPolicyVersion = 0;
                        if (message.requestedPolicyVersion != null && message.hasOwnProperty("requestedPolicyVersion"))
                            object.requestedPolicyVersion = message.requestedPolicyVersion;
                        return object;
                    };
    
                    /**
                     * Converts this GetPolicyOptions to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetPolicyOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for GetPolicyOptions
                     * @function getTypeUrl
                     * @memberof google.iam.v1.GetPolicyOptions
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    GetPolicyOptions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.GetPolicyOptions";
                    };
    
                    return GetPolicyOptions;
                })();
    
                v1.Policy = (function() {
    
                    /**
                     * Properties of a Policy.
                     * @memberof google.iam.v1
                     * @interface IPolicy
                     * @property {number|null} [version] Policy version
                     * @property {Array.<google.iam.v1.IBinding>|null} [bindings] Policy bindings
                     * @property {Array.<google.iam.v1.IAuditConfig>|null} [auditConfigs] Policy auditConfigs
                     * @property {Uint8Array|null} [etag] Policy etag
                     */
    
                    /**
                     * Constructs a new Policy.
                     * @memberof google.iam.v1
                     * @classdesc Represents a Policy.
                     * @implements IPolicy
                     * @constructor
                     * @param {google.iam.v1.IPolicy=} [properties] Properties to set
                     */
                    function Policy(properties) {
                        this.bindings = [];
                        this.auditConfigs = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Policy version.
                     * @member {number} version
                     * @memberof google.iam.v1.Policy
                     * @instance
                     */
                    Policy.prototype.version = 0;
    
                    /**
                     * Policy bindings.
                     * @member {Array.<google.iam.v1.IBinding>} bindings
                     * @memberof google.iam.v1.Policy
                     * @instance
                     */
                    Policy.prototype.bindings = $util.emptyArray;
    
                    /**
                     * Policy auditConfigs.
                     * @member {Array.<google.iam.v1.IAuditConfig>} auditConfigs
                     * @memberof google.iam.v1.Policy
                     * @instance
                     */
                    Policy.prototype.auditConfigs = $util.emptyArray;
    
                    /**
                     * Policy etag.
                     * @member {Uint8Array} etag
                     * @memberof google.iam.v1.Policy
                     * @instance
                     */
                    Policy.prototype.etag = $util.newBuffer([]);
    
                    /**
                     * Creates a new Policy instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {google.iam.v1.IPolicy=} [properties] Properties to set
                     * @returns {google.iam.v1.Policy} Policy instance
                     */
                    Policy.create = function create(properties) {
                        return new Policy(properties);
                    };
    
                    /**
                     * Encodes the specified Policy message. Does not implicitly {@link google.iam.v1.Policy.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {google.iam.v1.IPolicy} message Policy message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Policy.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.version);
                        if (message.etag != null && Object.hasOwnProperty.call(message, "etag"))
                            writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.etag);
                        if (message.bindings != null && message.bindings.length)
                            for (var i = 0; i < message.bindings.length; ++i)
                                $root.google.iam.v1.Binding.encode(message.bindings[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.auditConfigs != null && message.auditConfigs.length)
                            for (var i = 0; i < message.auditConfigs.length; ++i)
                                $root.google.iam.v1.AuditConfig.encode(message.auditConfigs[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Policy message, length delimited. Does not implicitly {@link google.iam.v1.Policy.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {google.iam.v1.IPolicy} message Policy message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Policy.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Policy message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.Policy} Policy
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Policy.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.Policy();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.version = reader.int32();
                                    break;
                                }
                            case 4: {
                                    if (!(message.bindings && message.bindings.length))
                                        message.bindings = [];
                                    message.bindings.push($root.google.iam.v1.Binding.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 6: {
                                    if (!(message.auditConfigs && message.auditConfigs.length))
                                        message.auditConfigs = [];
                                    message.auditConfigs.push($root.google.iam.v1.AuditConfig.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 3: {
                                    message.etag = reader.bytes();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Policy message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.Policy} Policy
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Policy.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Policy message.
                     * @function verify
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Policy.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.version != null && message.hasOwnProperty("version"))
                            if (!$util.isInteger(message.version))
                                return "version: integer expected";
                        if (message.bindings != null && message.hasOwnProperty("bindings")) {
                            if (!Array.isArray(message.bindings))
                                return "bindings: array expected";
                            for (var i = 0; i < message.bindings.length; ++i) {
                                var error = $root.google.iam.v1.Binding.verify(message.bindings[i]);
                                if (error)
                                    return "bindings." + error;
                            }
                        }
                        if (message.auditConfigs != null && message.hasOwnProperty("auditConfigs")) {
                            if (!Array.isArray(message.auditConfigs))
                                return "auditConfigs: array expected";
                            for (var i = 0; i < message.auditConfigs.length; ++i) {
                                var error = $root.google.iam.v1.AuditConfig.verify(message.auditConfigs[i]);
                                if (error)
                                    return "auditConfigs." + error;
                            }
                        }
                        if (message.etag != null && message.hasOwnProperty("etag"))
                            if (!(message.etag && typeof message.etag.length === "number" || $util.isString(message.etag)))
                                return "etag: buffer expected";
                        return null;
                    };
    
                    /**
                     * Creates a Policy message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.Policy} Policy
                     */
                    Policy.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.Policy)
                            return object;
                        var message = new $root.google.iam.v1.Policy();
                        if (object.version != null)
                            message.version = object.version | 0;
                        if (object.bindings) {
                            if (!Array.isArray(object.bindings))
                                throw TypeError(".google.iam.v1.Policy.bindings: array expected");
                            message.bindings = [];
                            for (var i = 0; i < object.bindings.length; ++i) {
                                if (typeof object.bindings[i] !== "object")
                                    throw TypeError(".google.iam.v1.Policy.bindings: object expected");
                                message.bindings[i] = $root.google.iam.v1.Binding.fromObject(object.bindings[i]);
                            }
                        }
                        if (object.auditConfigs) {
                            if (!Array.isArray(object.auditConfigs))
                                throw TypeError(".google.iam.v1.Policy.auditConfigs: array expected");
                            message.auditConfigs = [];
                            for (var i = 0; i < object.auditConfigs.length; ++i) {
                                if (typeof object.auditConfigs[i] !== "object")
                                    throw TypeError(".google.iam.v1.Policy.auditConfigs: object expected");
                                message.auditConfigs[i] = $root.google.iam.v1.AuditConfig.fromObject(object.auditConfigs[i]);
                            }
                        }
                        if (object.etag != null)
                            if (typeof object.etag === "string")
                                $util.base64.decode(object.etag, message.etag = $util.newBuffer($util.base64.length(object.etag)), 0);
                            else if (object.etag.length >= 0)
                                message.etag = object.etag;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Policy message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {google.iam.v1.Policy} message Policy
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Policy.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.bindings = [];
                            object.auditConfigs = [];
                        }
                        if (options.defaults) {
                            object.version = 0;
                            if (options.bytes === String)
                                object.etag = "";
                            else {
                                object.etag = [];
                                if (options.bytes !== Array)
                                    object.etag = $util.newBuffer(object.etag);
                            }
                        }
                        if (message.version != null && message.hasOwnProperty("version"))
                            object.version = message.version;
                        if (message.etag != null && message.hasOwnProperty("etag"))
                            object.etag = options.bytes === String ? $util.base64.encode(message.etag, 0, message.etag.length) : options.bytes === Array ? Array.prototype.slice.call(message.etag) : message.etag;
                        if (message.bindings && message.bindings.length) {
                            object.bindings = [];
                            for (var j = 0; j < message.bindings.length; ++j)
                                object.bindings[j] = $root.google.iam.v1.Binding.toObject(message.bindings[j], options);
                        }
                        if (message.auditConfigs && message.auditConfigs.length) {
                            object.auditConfigs = [];
                            for (var j = 0; j < message.auditConfigs.length; ++j)
                                object.auditConfigs[j] = $root.google.iam.v1.AuditConfig.toObject(message.auditConfigs[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Policy to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.Policy
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Policy.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Policy
                     * @function getTypeUrl
                     * @memberof google.iam.v1.Policy
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Policy.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.Policy";
                    };
    
                    return Policy;
                })();
    
                v1.Binding = (function() {
    
                    /**
                     * Properties of a Binding.
                     * @memberof google.iam.v1
                     * @interface IBinding
                     * @property {string|null} [role] Binding role
                     * @property {Array.<string>|null} [members] Binding members
                     * @property {google.type.IExpr|null} [condition] Binding condition
                     */
    
                    /**
                     * Constructs a new Binding.
                     * @memberof google.iam.v1
                     * @classdesc Represents a Binding.
                     * @implements IBinding
                     * @constructor
                     * @param {google.iam.v1.IBinding=} [properties] Properties to set
                     */
                    function Binding(properties) {
                        this.members = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Binding role.
                     * @member {string} role
                     * @memberof google.iam.v1.Binding
                     * @instance
                     */
                    Binding.prototype.role = "";
    
                    /**
                     * Binding members.
                     * @member {Array.<string>} members
                     * @memberof google.iam.v1.Binding
                     * @instance
                     */
                    Binding.prototype.members = $util.emptyArray;
    
                    /**
                     * Binding condition.
                     * @member {google.type.IExpr|null|undefined} condition
                     * @memberof google.iam.v1.Binding
                     * @instance
                     */
                    Binding.prototype.condition = null;
    
                    /**
                     * Creates a new Binding instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {google.iam.v1.IBinding=} [properties] Properties to set
                     * @returns {google.iam.v1.Binding} Binding instance
                     */
                    Binding.create = function create(properties) {
                        return new Binding(properties);
                    };
    
                    /**
                     * Encodes the specified Binding message. Does not implicitly {@link google.iam.v1.Binding.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {google.iam.v1.IBinding} message Binding message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Binding.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.role != null && Object.hasOwnProperty.call(message, "role"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.role);
                        if (message.members != null && message.members.length)
                            for (var i = 0; i < message.members.length; ++i)
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.members[i]);
                        if (message.condition != null && Object.hasOwnProperty.call(message, "condition"))
                            $root.google.type.Expr.encode(message.condition, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Binding message, length delimited. Does not implicitly {@link google.iam.v1.Binding.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {google.iam.v1.IBinding} message Binding message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Binding.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Binding message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.Binding} Binding
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Binding.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.Binding();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.role = reader.string();
                                    break;
                                }
                            case 2: {
                                    if (!(message.members && message.members.length))
                                        message.members = [];
                                    message.members.push(reader.string());
                                    break;
                                }
                            case 3: {
                                    message.condition = $root.google.type.Expr.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Binding message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.Binding} Binding
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Binding.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Binding message.
                     * @function verify
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Binding.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.role != null && message.hasOwnProperty("role"))
                            if (!$util.isString(message.role))
                                return "role: string expected";
                        if (message.members != null && message.hasOwnProperty("members")) {
                            if (!Array.isArray(message.members))
                                return "members: array expected";
                            for (var i = 0; i < message.members.length; ++i)
                                if (!$util.isString(message.members[i]))
                                    return "members: string[] expected";
                        }
                        if (message.condition != null && message.hasOwnProperty("condition")) {
                            var error = $root.google.type.Expr.verify(message.condition);
                            if (error)
                                return "condition." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Binding message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.Binding} Binding
                     */
                    Binding.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.Binding)
                            return object;
                        var message = new $root.google.iam.v1.Binding();
                        if (object.role != null)
                            message.role = String(object.role);
                        if (object.members) {
                            if (!Array.isArray(object.members))
                                throw TypeError(".google.iam.v1.Binding.members: array expected");
                            message.members = [];
                            for (var i = 0; i < object.members.length; ++i)
                                message.members[i] = String(object.members[i]);
                        }
                        if (object.condition != null) {
                            if (typeof object.condition !== "object")
                                throw TypeError(".google.iam.v1.Binding.condition: object expected");
                            message.condition = $root.google.type.Expr.fromObject(object.condition);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Binding message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {google.iam.v1.Binding} message Binding
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Binding.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.members = [];
                        if (options.defaults) {
                            object.role = "";
                            object.condition = null;
                        }
                        if (message.role != null && message.hasOwnProperty("role"))
                            object.role = message.role;
                        if (message.members && message.members.length) {
                            object.members = [];
                            for (var j = 0; j < message.members.length; ++j)
                                object.members[j] = message.members[j];
                        }
                        if (message.condition != null && message.hasOwnProperty("condition"))
                            object.condition = $root.google.type.Expr.toObject(message.condition, options);
                        return object;
                    };
    
                    /**
                     * Converts this Binding to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.Binding
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Binding.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for Binding
                     * @function getTypeUrl
                     * @memberof google.iam.v1.Binding
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    Binding.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.Binding";
                    };
    
                    return Binding;
                })();
    
                v1.AuditConfig = (function() {
    
                    /**
                     * Properties of an AuditConfig.
                     * @memberof google.iam.v1
                     * @interface IAuditConfig
                     * @property {string|null} [service] AuditConfig service
                     * @property {Array.<google.iam.v1.IAuditLogConfig>|null} [auditLogConfigs] AuditConfig auditLogConfigs
                     */
    
                    /**
                     * Constructs a new AuditConfig.
                     * @memberof google.iam.v1
                     * @classdesc Represents an AuditConfig.
                     * @implements IAuditConfig
                     * @constructor
                     * @param {google.iam.v1.IAuditConfig=} [properties] Properties to set
                     */
                    function AuditConfig(properties) {
                        this.auditLogConfigs = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * AuditConfig service.
                     * @member {string} service
                     * @memberof google.iam.v1.AuditConfig
                     * @instance
                     */
                    AuditConfig.prototype.service = "";
    
                    /**
                     * AuditConfig auditLogConfigs.
                     * @member {Array.<google.iam.v1.IAuditLogConfig>} auditLogConfigs
                     * @memberof google.iam.v1.AuditConfig
                     * @instance
                     */
                    AuditConfig.prototype.auditLogConfigs = $util.emptyArray;
    
                    /**
                     * Creates a new AuditConfig instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {google.iam.v1.IAuditConfig=} [properties] Properties to set
                     * @returns {google.iam.v1.AuditConfig} AuditConfig instance
                     */
                    AuditConfig.create = function create(properties) {
                        return new AuditConfig(properties);
                    };
    
                    /**
                     * Encodes the specified AuditConfig message. Does not implicitly {@link google.iam.v1.AuditConfig.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {google.iam.v1.IAuditConfig} message AuditConfig message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditConfig.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.service);
                        if (message.auditLogConfigs != null && message.auditLogConfigs.length)
                            for (var i = 0; i < message.auditLogConfigs.length; ++i)
                                $root.google.iam.v1.AuditLogConfig.encode(message.auditLogConfigs[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified AuditConfig message, length delimited. Does not implicitly {@link google.iam.v1.AuditConfig.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {google.iam.v1.IAuditConfig} message AuditConfig message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditConfig.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an AuditConfig message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.AuditConfig} AuditConfig
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditConfig.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.AuditConfig();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.service = reader.string();
                                    break;
                                }
                            case 3: {
                                    if (!(message.auditLogConfigs && message.auditLogConfigs.length))
                                        message.auditLogConfigs = [];
                                    message.auditLogConfigs.push($root.google.iam.v1.AuditLogConfig.decode(reader, reader.uint32()));
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an AuditConfig message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.AuditConfig} AuditConfig
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditConfig.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an AuditConfig message.
                     * @function verify
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    AuditConfig.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.service != null && message.hasOwnProperty("service"))
                            if (!$util.isString(message.service))
                                return "service: string expected";
                        if (message.auditLogConfigs != null && message.hasOwnProperty("auditLogConfigs")) {
                            if (!Array.isArray(message.auditLogConfigs))
                                return "auditLogConfigs: array expected";
                            for (var i = 0; i < message.auditLogConfigs.length; ++i) {
                                var error = $root.google.iam.v1.AuditLogConfig.verify(message.auditLogConfigs[i]);
                                if (error)
                                    return "auditLogConfigs." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates an AuditConfig message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.AuditConfig} AuditConfig
                     */
                    AuditConfig.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.AuditConfig)
                            return object;
                        var message = new $root.google.iam.v1.AuditConfig();
                        if (object.service != null)
                            message.service = String(object.service);
                        if (object.auditLogConfigs) {
                            if (!Array.isArray(object.auditLogConfigs))
                                throw TypeError(".google.iam.v1.AuditConfig.auditLogConfigs: array expected");
                            message.auditLogConfigs = [];
                            for (var i = 0; i < object.auditLogConfigs.length; ++i) {
                                if (typeof object.auditLogConfigs[i] !== "object")
                                    throw TypeError(".google.iam.v1.AuditConfig.auditLogConfigs: object expected");
                                message.auditLogConfigs[i] = $root.google.iam.v1.AuditLogConfig.fromObject(object.auditLogConfigs[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an AuditConfig message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {google.iam.v1.AuditConfig} message AuditConfig
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    AuditConfig.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.auditLogConfigs = [];
                        if (options.defaults)
                            object.service = "";
                        if (message.service != null && message.hasOwnProperty("service"))
                            object.service = message.service;
                        if (message.auditLogConfigs && message.auditLogConfigs.length) {
                            object.auditLogConfigs = [];
                            for (var j = 0; j < message.auditLogConfigs.length; ++j)
                                object.auditLogConfigs[j] = $root.google.iam.v1.AuditLogConfig.toObject(message.auditLogConfigs[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this AuditConfig to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.AuditConfig
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    AuditConfig.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for AuditConfig
                     * @function getTypeUrl
                     * @memberof google.iam.v1.AuditConfig
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    AuditConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.AuditConfig";
                    };
    
                    return AuditConfig;
                })();
    
                v1.AuditLogConfig = (function() {
    
                    /**
                     * Properties of an AuditLogConfig.
                     * @memberof google.iam.v1
                     * @interface IAuditLogConfig
                     * @property {google.iam.v1.AuditLogConfig.LogType|null} [logType] AuditLogConfig logType
                     * @property {Array.<string>|null} [exemptedMembers] AuditLogConfig exemptedMembers
                     */
    
                    /**
                     * Constructs a new AuditLogConfig.
                     * @memberof google.iam.v1
                     * @classdesc Represents an AuditLogConfig.
                     * @implements IAuditLogConfig
                     * @constructor
                     * @param {google.iam.v1.IAuditLogConfig=} [properties] Properties to set
                     */
                    function AuditLogConfig(properties) {
                        this.exemptedMembers = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * AuditLogConfig logType.
                     * @member {google.iam.v1.AuditLogConfig.LogType} logType
                     * @memberof google.iam.v1.AuditLogConfig
                     * @instance
                     */
                    AuditLogConfig.prototype.logType = 0;
    
                    /**
                     * AuditLogConfig exemptedMembers.
                     * @member {Array.<string>} exemptedMembers
                     * @memberof google.iam.v1.AuditLogConfig
                     * @instance
                     */
                    AuditLogConfig.prototype.exemptedMembers = $util.emptyArray;
    
                    /**
                     * Creates a new AuditLogConfig instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {google.iam.v1.IAuditLogConfig=} [properties] Properties to set
                     * @returns {google.iam.v1.AuditLogConfig} AuditLogConfig instance
                     */
                    AuditLogConfig.create = function create(properties) {
                        return new AuditLogConfig(properties);
                    };
    
                    /**
                     * Encodes the specified AuditLogConfig message. Does not implicitly {@link google.iam.v1.AuditLogConfig.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {google.iam.v1.IAuditLogConfig} message AuditLogConfig message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditLogConfig.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.logType != null && Object.hasOwnProperty.call(message, "logType"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.logType);
                        if (message.exemptedMembers != null && message.exemptedMembers.length)
                            for (var i = 0; i < message.exemptedMembers.length; ++i)
                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.exemptedMembers[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified AuditLogConfig message, length delimited. Does not implicitly {@link google.iam.v1.AuditLogConfig.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {google.iam.v1.IAuditLogConfig} message AuditLogConfig message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditLogConfig.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an AuditLogConfig message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.AuditLogConfig} AuditLogConfig
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditLogConfig.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.AuditLogConfig();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.logType = reader.int32();
                                    break;
                                }
                            case 2: {
                                    if (!(message.exemptedMembers && message.exemptedMembers.length))
                                        message.exemptedMembers = [];
                                    message.exemptedMembers.push(reader.string());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an AuditLogConfig message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.AuditLogConfig} AuditLogConfig
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditLogConfig.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an AuditLogConfig message.
                     * @function verify
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    AuditLogConfig.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logType != null && message.hasOwnProperty("logType"))
                            switch (message.logType) {
                            default:
                                return "logType: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                                break;
                            }
                        if (message.exemptedMembers != null && message.hasOwnProperty("exemptedMembers")) {
                            if (!Array.isArray(message.exemptedMembers))
                                return "exemptedMembers: array expected";
                            for (var i = 0; i < message.exemptedMembers.length; ++i)
                                if (!$util.isString(message.exemptedMembers[i]))
                                    return "exemptedMembers: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates an AuditLogConfig message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.AuditLogConfig} AuditLogConfig
                     */
                    AuditLogConfig.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.AuditLogConfig)
                            return object;
                        var message = new $root.google.iam.v1.AuditLogConfig();
                        switch (object.logType) {
                        default:
                            if (typeof object.logType === "number") {
                                message.logType = object.logType;
                                break;
                            }
                            break;
                        case "LOG_TYPE_UNSPECIFIED":
                        case 0:
                            message.logType = 0;
                            break;
                        case "ADMIN_READ":
                        case 1:
                            message.logType = 1;
                            break;
                        case "DATA_WRITE":
                        case 2:
                            message.logType = 2;
                            break;
                        case "DATA_READ":
                        case 3:
                            message.logType = 3;
                            break;
                        }
                        if (object.exemptedMembers) {
                            if (!Array.isArray(object.exemptedMembers))
                                throw TypeError(".google.iam.v1.AuditLogConfig.exemptedMembers: array expected");
                            message.exemptedMembers = [];
                            for (var i = 0; i < object.exemptedMembers.length; ++i)
                                message.exemptedMembers[i] = String(object.exemptedMembers[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an AuditLogConfig message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {google.iam.v1.AuditLogConfig} message AuditLogConfig
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    AuditLogConfig.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.exemptedMembers = [];
                        if (options.defaults)
                            object.logType = options.enums === String ? "LOG_TYPE_UNSPECIFIED" : 0;
                        if (message.logType != null && message.hasOwnProperty("logType"))
                            object.logType = options.enums === String ? $root.google.iam.v1.AuditLogConfig.LogType[message.logType] === undefined ? message.logType : $root.google.iam.v1.AuditLogConfig.LogType[message.logType] : message.logType;
                        if (message.exemptedMembers && message.exemptedMembers.length) {
                            object.exemptedMembers = [];
                            for (var j = 0; j < message.exemptedMembers.length; ++j)
                                object.exemptedMembers[j] = message.exemptedMembers[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this AuditLogConfig to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.AuditLogConfig
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    AuditLogConfig.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for AuditLogConfig
                     * @function getTypeUrl
                     * @memberof google.iam.v1.AuditLogConfig
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    AuditLogConfig.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.AuditLogConfig";
                    };
    
                    /**
                     * LogType enum.
                     * @name google.iam.v1.AuditLogConfig.LogType
                     * @enum {number}
                     * @property {number} LOG_TYPE_UNSPECIFIED=0 LOG_TYPE_UNSPECIFIED value
                     * @property {number} ADMIN_READ=1 ADMIN_READ value
                     * @property {number} DATA_WRITE=2 DATA_WRITE value
                     * @property {number} DATA_READ=3 DATA_READ value
                     */
                    AuditLogConfig.LogType = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "LOG_TYPE_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "ADMIN_READ"] = 1;
                        values[valuesById[2] = "DATA_WRITE"] = 2;
                        values[valuesById[3] = "DATA_READ"] = 3;
                        return values;
                    })();
    
                    return AuditLogConfig;
                })();
    
                v1.PolicyDelta = (function() {
    
                    /**
                     * Properties of a PolicyDelta.
                     * @memberof google.iam.v1
                     * @interface IPolicyDelta
                     * @property {Array.<google.iam.v1.IBindingDelta>|null} [bindingDeltas] PolicyDelta bindingDeltas
                     * @property {Array.<google.iam.v1.IAuditConfigDelta>|null} [auditConfigDeltas] PolicyDelta auditConfigDeltas
                     */
    
                    /**
                     * Constructs a new PolicyDelta.
                     * @memberof google.iam.v1
                     * @classdesc Represents a PolicyDelta.
                     * @implements IPolicyDelta
                     * @constructor
                     * @param {google.iam.v1.IPolicyDelta=} [properties] Properties to set
                     */
                    function PolicyDelta(properties) {
                        this.bindingDeltas = [];
                        this.auditConfigDeltas = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * PolicyDelta bindingDeltas.
                     * @member {Array.<google.iam.v1.IBindingDelta>} bindingDeltas
                     * @memberof google.iam.v1.PolicyDelta
                     * @instance
                     */
                    PolicyDelta.prototype.bindingDeltas = $util.emptyArray;
    
                    /**
                     * PolicyDelta auditConfigDeltas.
                     * @member {Array.<google.iam.v1.IAuditConfigDelta>} auditConfigDeltas
                     * @memberof google.iam.v1.PolicyDelta
                     * @instance
                     */
                    PolicyDelta.prototype.auditConfigDeltas = $util.emptyArray;
    
                    /**
                     * Creates a new PolicyDelta instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {google.iam.v1.IPolicyDelta=} [properties] Properties to set
                     * @returns {google.iam.v1.PolicyDelta} PolicyDelta instance
                     */
                    PolicyDelta.create = function create(properties) {
                        return new PolicyDelta(properties);
                    };
    
                    /**
                     * Encodes the specified PolicyDelta message. Does not implicitly {@link google.iam.v1.PolicyDelta.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {google.iam.v1.IPolicyDelta} message PolicyDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PolicyDelta.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.bindingDeltas != null && message.bindingDeltas.length)
                            for (var i = 0; i < message.bindingDeltas.length; ++i)
                                $root.google.iam.v1.BindingDelta.encode(message.bindingDeltas[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.auditConfigDeltas != null && message.auditConfigDeltas.length)
                            for (var i = 0; i < message.auditConfigDeltas.length; ++i)
                                $root.google.iam.v1.AuditConfigDelta.encode(message.auditConfigDeltas[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified PolicyDelta message, length delimited. Does not implicitly {@link google.iam.v1.PolicyDelta.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {google.iam.v1.IPolicyDelta} message PolicyDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    PolicyDelta.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a PolicyDelta message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.PolicyDelta} PolicyDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PolicyDelta.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.PolicyDelta();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    if (!(message.bindingDeltas && message.bindingDeltas.length))
                                        message.bindingDeltas = [];
                                    message.bindingDeltas.push($root.google.iam.v1.BindingDelta.decode(reader, reader.uint32()));
                                    break;
                                }
                            case 2: {
                                    if (!(message.auditConfigDeltas && message.auditConfigDeltas.length))
                                        message.auditConfigDeltas = [];
                                    message.auditConfigDeltas.push($root.google.iam.v1.AuditConfigDelta.decode(reader, reader.uint32()));
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a PolicyDelta message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.PolicyDelta} PolicyDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    PolicyDelta.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a PolicyDelta message.
                     * @function verify
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    PolicyDelta.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.bindingDeltas != null && message.hasOwnProperty("bindingDeltas")) {
                            if (!Array.isArray(message.bindingDeltas))
                                return "bindingDeltas: array expected";
                            for (var i = 0; i < message.bindingDeltas.length; ++i) {
                                var error = $root.google.iam.v1.BindingDelta.verify(message.bindingDeltas[i]);
                                if (error)
                                    return "bindingDeltas." + error;
                            }
                        }
                        if (message.auditConfigDeltas != null && message.hasOwnProperty("auditConfigDeltas")) {
                            if (!Array.isArray(message.auditConfigDeltas))
                                return "auditConfigDeltas: array expected";
                            for (var i = 0; i < message.auditConfigDeltas.length; ++i) {
                                var error = $root.google.iam.v1.AuditConfigDelta.verify(message.auditConfigDeltas[i]);
                                if (error)
                                    return "auditConfigDeltas." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a PolicyDelta message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.PolicyDelta} PolicyDelta
                     */
                    PolicyDelta.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.PolicyDelta)
                            return object;
                        var message = new $root.google.iam.v1.PolicyDelta();
                        if (object.bindingDeltas) {
                            if (!Array.isArray(object.bindingDeltas))
                                throw TypeError(".google.iam.v1.PolicyDelta.bindingDeltas: array expected");
                            message.bindingDeltas = [];
                            for (var i = 0; i < object.bindingDeltas.length; ++i) {
                                if (typeof object.bindingDeltas[i] !== "object")
                                    throw TypeError(".google.iam.v1.PolicyDelta.bindingDeltas: object expected");
                                message.bindingDeltas[i] = $root.google.iam.v1.BindingDelta.fromObject(object.bindingDeltas[i]);
                            }
                        }
                        if (object.auditConfigDeltas) {
                            if (!Array.isArray(object.auditConfigDeltas))
                                throw TypeError(".google.iam.v1.PolicyDelta.auditConfigDeltas: array expected");
                            message.auditConfigDeltas = [];
                            for (var i = 0; i < object.auditConfigDeltas.length; ++i) {
                                if (typeof object.auditConfigDeltas[i] !== "object")
                                    throw TypeError(".google.iam.v1.PolicyDelta.auditConfigDeltas: object expected");
                                message.auditConfigDeltas[i] = $root.google.iam.v1.AuditConfigDelta.fromObject(object.auditConfigDeltas[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a PolicyDelta message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {google.iam.v1.PolicyDelta} message PolicyDelta
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    PolicyDelta.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.bindingDeltas = [];
                            object.auditConfigDeltas = [];
                        }
                        if (message.bindingDeltas && message.bindingDeltas.length) {
                            object.bindingDeltas = [];
                            for (var j = 0; j < message.bindingDeltas.length; ++j)
                                object.bindingDeltas[j] = $root.google.iam.v1.BindingDelta.toObject(message.bindingDeltas[j], options);
                        }
                        if (message.auditConfigDeltas && message.auditConfigDeltas.length) {
                            object.auditConfigDeltas = [];
                            for (var j = 0; j < message.auditConfigDeltas.length; ++j)
                                object.auditConfigDeltas[j] = $root.google.iam.v1.AuditConfigDelta.toObject(message.auditConfigDeltas[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this PolicyDelta to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.PolicyDelta
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    PolicyDelta.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for PolicyDelta
                     * @function getTypeUrl
                     * @memberof google.iam.v1.PolicyDelta
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    PolicyDelta.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.PolicyDelta";
                    };
    
                    return PolicyDelta;
                })();
    
                v1.BindingDelta = (function() {
    
                    /**
                     * Properties of a BindingDelta.
                     * @memberof google.iam.v1
                     * @interface IBindingDelta
                     * @property {google.iam.v1.BindingDelta.Action|null} [action] BindingDelta action
                     * @property {string|null} [role] BindingDelta role
                     * @property {string|null} [member] BindingDelta member
                     * @property {google.type.IExpr|null} [condition] BindingDelta condition
                     */
    
                    /**
                     * Constructs a new BindingDelta.
                     * @memberof google.iam.v1
                     * @classdesc Represents a BindingDelta.
                     * @implements IBindingDelta
                     * @constructor
                     * @param {google.iam.v1.IBindingDelta=} [properties] Properties to set
                     */
                    function BindingDelta(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BindingDelta action.
                     * @member {google.iam.v1.BindingDelta.Action} action
                     * @memberof google.iam.v1.BindingDelta
                     * @instance
                     */
                    BindingDelta.prototype.action = 0;
    
                    /**
                     * BindingDelta role.
                     * @member {string} role
                     * @memberof google.iam.v1.BindingDelta
                     * @instance
                     */
                    BindingDelta.prototype.role = "";
    
                    /**
                     * BindingDelta member.
                     * @member {string} member
                     * @memberof google.iam.v1.BindingDelta
                     * @instance
                     */
                    BindingDelta.prototype.member = "";
    
                    /**
                     * BindingDelta condition.
                     * @member {google.type.IExpr|null|undefined} condition
                     * @memberof google.iam.v1.BindingDelta
                     * @instance
                     */
                    BindingDelta.prototype.condition = null;
    
                    /**
                     * Creates a new BindingDelta instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {google.iam.v1.IBindingDelta=} [properties] Properties to set
                     * @returns {google.iam.v1.BindingDelta} BindingDelta instance
                     */
                    BindingDelta.create = function create(properties) {
                        return new BindingDelta(properties);
                    };
    
                    /**
                     * Encodes the specified BindingDelta message. Does not implicitly {@link google.iam.v1.BindingDelta.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {google.iam.v1.IBindingDelta} message BindingDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BindingDelta.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.action);
                        if (message.role != null && Object.hasOwnProperty.call(message, "role"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.role);
                        if (message.member != null && Object.hasOwnProperty.call(message, "member"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.member);
                        if (message.condition != null && Object.hasOwnProperty.call(message, "condition"))
                            $root.google.type.Expr.encode(message.condition, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BindingDelta message, length delimited. Does not implicitly {@link google.iam.v1.BindingDelta.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {google.iam.v1.IBindingDelta} message BindingDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BindingDelta.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BindingDelta message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.BindingDelta} BindingDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BindingDelta.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.BindingDelta();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.action = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.role = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.member = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.condition = $root.google.type.Expr.decode(reader, reader.uint32());
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BindingDelta message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.BindingDelta} BindingDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BindingDelta.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BindingDelta message.
                     * @function verify
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BindingDelta.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.action != null && message.hasOwnProperty("action"))
                            switch (message.action) {
                            default:
                                return "action: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.role != null && message.hasOwnProperty("role"))
                            if (!$util.isString(message.role))
                                return "role: string expected";
                        if (message.member != null && message.hasOwnProperty("member"))
                            if (!$util.isString(message.member))
                                return "member: string expected";
                        if (message.condition != null && message.hasOwnProperty("condition")) {
                            var error = $root.google.type.Expr.verify(message.condition);
                            if (error)
                                return "condition." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a BindingDelta message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.BindingDelta} BindingDelta
                     */
                    BindingDelta.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.BindingDelta)
                            return object;
                        var message = new $root.google.iam.v1.BindingDelta();
                        switch (object.action) {
                        default:
                            if (typeof object.action === "number") {
                                message.action = object.action;
                                break;
                            }
                            break;
                        case "ACTION_UNSPECIFIED":
                        case 0:
                            message.action = 0;
                            break;
                        case "ADD":
                        case 1:
                            message.action = 1;
                            break;
                        case "REMOVE":
                        case 2:
                            message.action = 2;
                            break;
                        }
                        if (object.role != null)
                            message.role = String(object.role);
                        if (object.member != null)
                            message.member = String(object.member);
                        if (object.condition != null) {
                            if (typeof object.condition !== "object")
                                throw TypeError(".google.iam.v1.BindingDelta.condition: object expected");
                            message.condition = $root.google.type.Expr.fromObject(object.condition);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BindingDelta message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {google.iam.v1.BindingDelta} message BindingDelta
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BindingDelta.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.action = options.enums === String ? "ACTION_UNSPECIFIED" : 0;
                            object.role = "";
                            object.member = "";
                            object.condition = null;
                        }
                        if (message.action != null && message.hasOwnProperty("action"))
                            object.action = options.enums === String ? $root.google.iam.v1.BindingDelta.Action[message.action] === undefined ? message.action : $root.google.iam.v1.BindingDelta.Action[message.action] : message.action;
                        if (message.role != null && message.hasOwnProperty("role"))
                            object.role = message.role;
                        if (message.member != null && message.hasOwnProperty("member"))
                            object.member = message.member;
                        if (message.condition != null && message.hasOwnProperty("condition"))
                            object.condition = $root.google.type.Expr.toObject(message.condition, options);
                        return object;
                    };
    
                    /**
                     * Converts this BindingDelta to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.BindingDelta
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BindingDelta.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for BindingDelta
                     * @function getTypeUrl
                     * @memberof google.iam.v1.BindingDelta
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    BindingDelta.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.BindingDelta";
                    };
    
                    /**
                     * Action enum.
                     * @name google.iam.v1.BindingDelta.Action
                     * @enum {number}
                     * @property {number} ACTION_UNSPECIFIED=0 ACTION_UNSPECIFIED value
                     * @property {number} ADD=1 ADD value
                     * @property {number} REMOVE=2 REMOVE value
                     */
                    BindingDelta.Action = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "ACTION_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "ADD"] = 1;
                        values[valuesById[2] = "REMOVE"] = 2;
                        return values;
                    })();
    
                    return BindingDelta;
                })();
    
                v1.AuditConfigDelta = (function() {
    
                    /**
                     * Properties of an AuditConfigDelta.
                     * @memberof google.iam.v1
                     * @interface IAuditConfigDelta
                     * @property {google.iam.v1.AuditConfigDelta.Action|null} [action] AuditConfigDelta action
                     * @property {string|null} [service] AuditConfigDelta service
                     * @property {string|null} [exemptedMember] AuditConfigDelta exemptedMember
                     * @property {string|null} [logType] AuditConfigDelta logType
                     */
    
                    /**
                     * Constructs a new AuditConfigDelta.
                     * @memberof google.iam.v1
                     * @classdesc Represents an AuditConfigDelta.
                     * @implements IAuditConfigDelta
                     * @constructor
                     * @param {google.iam.v1.IAuditConfigDelta=} [properties] Properties to set
                     */
                    function AuditConfigDelta(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * AuditConfigDelta action.
                     * @member {google.iam.v1.AuditConfigDelta.Action} action
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @instance
                     */
                    AuditConfigDelta.prototype.action = 0;
    
                    /**
                     * AuditConfigDelta service.
                     * @member {string} service
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @instance
                     */
                    AuditConfigDelta.prototype.service = "";
    
                    /**
                     * AuditConfigDelta exemptedMember.
                     * @member {string} exemptedMember
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @instance
                     */
                    AuditConfigDelta.prototype.exemptedMember = "";
    
                    /**
                     * AuditConfigDelta logType.
                     * @member {string} logType
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @instance
                     */
                    AuditConfigDelta.prototype.logType = "";
    
                    /**
                     * Creates a new AuditConfigDelta instance using the specified properties.
                     * @function create
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {google.iam.v1.IAuditConfigDelta=} [properties] Properties to set
                     * @returns {google.iam.v1.AuditConfigDelta} AuditConfigDelta instance
                     */
                    AuditConfigDelta.create = function create(properties) {
                        return new AuditConfigDelta(properties);
                    };
    
                    /**
                     * Encodes the specified AuditConfigDelta message. Does not implicitly {@link google.iam.v1.AuditConfigDelta.verify|verify} messages.
                     * @function encode
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {google.iam.v1.IAuditConfigDelta} message AuditConfigDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditConfigDelta.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.action);
                        if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.service);
                        if (message.exemptedMember != null && Object.hasOwnProperty.call(message, "exemptedMember"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.exemptedMember);
                        if (message.logType != null && Object.hasOwnProperty.call(message, "logType"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.logType);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified AuditConfigDelta message, length delimited. Does not implicitly {@link google.iam.v1.AuditConfigDelta.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {google.iam.v1.IAuditConfigDelta} message AuditConfigDelta message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    AuditConfigDelta.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an AuditConfigDelta message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.iam.v1.AuditConfigDelta} AuditConfigDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditConfigDelta.decode = function decode(reader, length, error) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.iam.v1.AuditConfigDelta();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            if (tag === error)
                                break;
                            switch (tag >>> 3) {
                            case 1: {
                                    message.action = reader.int32();
                                    break;
                                }
                            case 2: {
                                    message.service = reader.string();
                                    break;
                                }
                            case 3: {
                                    message.exemptedMember = reader.string();
                                    break;
                                }
                            case 4: {
                                    message.logType = reader.string();
                                    break;
                                }
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an AuditConfigDelta message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.iam.v1.AuditConfigDelta} AuditConfigDelta
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    AuditConfigDelta.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an AuditConfigDelta message.
                     * @function verify
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    AuditConfigDelta.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.action != null && message.hasOwnProperty("action"))
                            switch (message.action) {
                            default:
                                return "action: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.service != null && message.hasOwnProperty("service"))
                            if (!$util.isString(message.service))
                                return "service: string expected";
                        if (message.exemptedMember != null && message.hasOwnProperty("exemptedMember"))
                            if (!$util.isString(message.exemptedMember))
                                return "exemptedMember: string expected";
                        if (message.logType != null && message.hasOwnProperty("logType"))
                            if (!$util.isString(message.logType))
                                return "logType: string expected";
                        return null;
                    };
    
                    /**
                     * Creates an AuditConfigDelta message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.iam.v1.AuditConfigDelta} AuditConfigDelta
                     */
                    AuditConfigDelta.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.iam.v1.AuditConfigDelta)
                            return object;
                        var message = new $root.google.iam.v1.AuditConfigDelta();
                        switch (object.action) {
                        default:
                            if (typeof object.action === "number") {
                                message.action = object.action;
                                break;
                            }
                            break;
                        case "ACTION_UNSPECIFIED":
                        case 0:
                            message.action = 0;
                            break;
                        case "ADD":
                        case 1:
                            message.action = 1;
                            break;
                        case "REMOVE":
                        case 2:
                            message.action = 2;
                            break;
                        }
                        if (object.service != null)
                            message.service = String(object.service);
                        if (object.exemptedMember != null)
                            message.exemptedMember = String(object.exemptedMember);
                        if (object.logType != null)
                            message.logType = String(object.logType);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an AuditConfigDelta message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {google.iam.v1.AuditConfigDelta} message AuditConfigDelta
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    AuditConfigDelta.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.action = options.enums === String ? "ACTION_UNSPECIFIED" : 0;
                            object.service = "";
                            object.exemptedMember = "";
                            object.logType = "";
                        }
                        if (message.action != null && message.hasOwnProperty("action"))
                            object.action = options.enums === String ? $root.google.iam.v1.AuditConfigDelta.Action[message.action] === undefined ? message.action : $root.google.iam.v1.AuditConfigDelta.Action[message.action] : message.action;
                        if (message.service != null && message.hasOwnProperty("service"))
                            object.service = message.service;
                        if (message.exemptedMember != null && message.hasOwnProperty("exemptedMember"))
                            object.exemptedMember = message.exemptedMember;
                        if (message.logType != null && message.hasOwnProperty("logType"))
                            object.logType = message.logType;
                        return object;
                    };
    
                    /**
                     * Converts this AuditConfigDelta to JSON.
                     * @function toJSON
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    AuditConfigDelta.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * Gets the default type url for AuditConfigDelta
                     * @function getTypeUrl
                     * @memberof google.iam.v1.AuditConfigDelta
                     * @static
                     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                     * @returns {string} The default type url
                     */
                    AuditConfigDelta.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                        if (typeUrlPrefix === undefined) {
                            typeUrlPrefix = "type.googleapis.com";
                        }
                        return typeUrlPrefix + "/google.iam.v1.AuditConfigDelta";
                    };
    
                    /**
                     * Action enum.
                     * @name google.iam.v1.AuditConfigDelta.Action
                     * @enum {number}
                     * @property {number} ACTION_UNSPECIFIED=0 ACTION_UNSPECIFIED value
                     * @property {number} ADD=1 ADD value
                     * @property {number} REMOVE=2 REMOVE value
                     */
                    AuditConfigDelta.Action = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "ACTION_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "ADD"] = 1;
                        values[valuesById[2] = "REMOVE"] = 2;
                        return values;
                    })();
    
                    return AuditConfigDelta;
                })();
    
                return v1;
            })();
    
            return iam;
        })();
    
        google.type = (function() {
    
            /**
             * Namespace type.
             * @memberof google
             * @namespace
             */
            var type = {};
    
            type.Expr = (function() {
    
                /**
                 * Properties of an Expr.
                 * @memberof google.type
                 * @interface IExpr
                 * @property {string|null} [expression] Expr expression
                 * @property {string|null} [title] Expr title
                 * @property {string|null} [description] Expr description
                 * @property {string|null} [location] Expr location
                 */
    
                /**
                 * Constructs a new Expr.
                 * @memberof google.type
                 * @classdesc Represents an Expr.
                 * @implements IExpr
                 * @constructor
                 * @param {google.type.IExpr=} [properties] Properties to set
                 */
                function Expr(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Expr expression.
                 * @member {string} expression
                 * @memberof google.type.Expr
                 * @instance
                 */
                Expr.prototype.expression = "";
    
                /**
                 * Expr title.
                 * @member {string} title
                 * @memberof google.type.Expr
                 * @instance
                 */
                Expr.prototype.title = "";
    
                /**
                 * Expr description.
                 * @member {string} description
                 * @memberof google.type.Expr
                 * @instance
                 */
                Expr.prototype.description = "";
    
                /**
                 * Expr location.
                 * @member {string} location
                 * @memberof google.type.Expr
                 * @instance
                 */
                Expr.prototype.location = "";
    
                /**
                 * Creates a new Expr instance using the specified properties.
                 * @function create
                 * @memberof google.type.Expr
                 * @static
                 * @param {google.type.IExpr=} [properties] Properties to set
                 * @returns {google.type.Expr} Expr instance
                 */
                Expr.create = function create(properties) {
                    return new Expr(properties);
                };
    
                /**
                 * Encodes the specified Expr message. Does not implicitly {@link google.type.Expr.verify|verify} messages.
                 * @function encode
                 * @memberof google.type.Expr
                 * @static
                 * @param {google.type.IExpr} message Expr message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Expr.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.expression != null && Object.hasOwnProperty.call(message, "expression"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.expression);
                    if (message.title != null && Object.hasOwnProperty.call(message, "title"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.title);
                    if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                    if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.location);
                    return writer;
                };
    
                /**
                 * Encodes the specified Expr message, length delimited. Does not implicitly {@link google.type.Expr.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.type.Expr
                 * @static
                 * @param {google.type.IExpr} message Expr message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Expr.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Expr message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.type.Expr
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.type.Expr} Expr
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Expr.decode = function decode(reader, length, error) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.type.Expr();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        if (tag === error)
                            break;
                        switch (tag >>> 3) {
                        case 1: {
                                message.expression = reader.string();
                                break;
                            }
                        case 2: {
                                message.title = reader.string();
                                break;
                            }
                        case 3: {
                                message.description = reader.string();
                                break;
                            }
                        case 4: {
                                message.location = reader.string();
                                break;
                            }
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Expr message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.type.Expr
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.type.Expr} Expr
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Expr.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Expr message.
                 * @function verify
                 * @memberof google.type.Expr
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Expr.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.expression != null && message.hasOwnProperty("expression"))
                        if (!$util.isString(message.expression))
                            return "expression: string expected";
                    if (message.title != null && message.hasOwnProperty("title"))
                        if (!$util.isString(message.title))
                            return "title: string expected";
                    if (message.description != null && message.hasOwnProperty("description"))
                        if (!$util.isString(message.description))
                            return "description: string expected";
                    if (message.location != null && message.hasOwnProperty("location"))
                        if (!$util.isString(message.location))
                            return "location: string expected";
                    return null;
                };
    
                /**
                 * Creates an Expr message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.type.Expr
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.type.Expr} Expr
                 */
                Expr.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.type.Expr)
                        return object;
                    var message = new $root.google.type.Expr();
                    if (object.expression != null)
                        message.expression = String(object.expression);
                    if (object.title != null)
                        message.title = String(object.title);
                    if (object.description != null)
                        message.description = String(object.description);
                    if (object.location != null)
                        message.location = String(object.location);
                    return message;
                };
    
                /**
                 * Creates a plain object from an Expr message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.type.Expr
                 * @static
                 * @param {google.type.Expr} message Expr
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Expr.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.expression = "";
                        object.title = "";
                        object.description = "";
                        object.location = "";
                    }
                    if (message.expression != null && message.hasOwnProperty("expression"))
                        object.expression = message.expression;
                    if (message.title != null && message.hasOwnProperty("title"))
                        object.title = message.title;
                    if (message.description != null && message.hasOwnProperty("description"))
                        object.description = message.description;
                    if (message.location != null && message.hasOwnProperty("location"))
                        object.location = message.location;
                    return object;
                };
    
                /**
                 * Converts this Expr to JSON.
                 * @function toJSON
                 * @memberof google.type.Expr
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Expr.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Gets the default type url for Expr
                 * @function getTypeUrl
                 * @memberof google.type.Expr
                 * @static
                 * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
                 * @returns {string} The default type url
                 */
                Expr.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                    if (typeUrlPrefix === undefined) {
                        typeUrlPrefix = "type.googleapis.com";
                    }
                    return typeUrlPrefix + "/google.type.Expr";
                };
    
                return Expr;
            })();
    
            return type;
        })();
    
        return google;
    })();

    return $root;
});
